﻿/******************************************************************************************************/
//    <script src="<%= resolveclienturl("~/js/common.js") %>" type="text/javascript"></script>
/******************************************************************************************************/
function jsOver(el, blnOver) {
    el.className = el.className.replace('-over', '')

    if (blnOver)
        el.className += '-over'
}

function changeColor(id, color) {
    element = document.getElementById(id);
    event.cancelBubble = true;
    oldColor = element.currentStyle.background;
    element.style.background = color;
}

// on upload button click temporarily disables ajax to perform
// upload actions
function conditionalPostback(sender, args) {
    // alert(args.get_eventTarget());
    var txt = "";
    txt = args.get_eventTarget();
    txt = txt.toLowerCase();
    // alert(txt);

    // Disable ajax for logo or screenshot update (input type=file)
    if (txt.indexOf("productdetailuc1") > 0 && txt.indexOf("savelogo") > 0) {
        args.set_enableAjax(false);
    }

    if (txt.indexOf("productss1") > 0 && txt.indexOf("save") > 0) {
        args.set_enableAjax(false);
    }

}


// FM 2009-07-24
// XMLHTTP to log direct click
function LogClick(_adid, _link) {
    var s_res;
    var s_type;

    s_res = screen.width + 'x' + screen.height;
    s_type = '1';

    // alert('adid/linkid/sres/stype: ' + _adid + '/' + _link + '/' + s_res + '/' + s_type);

    $.get('../goto.aspx', { s_res: s_res, t: s_type, ad: _adid, link: _link });

}

// FM 2009-02-23
// get client window dimension (excluding toolbars)
function GetWindowSize() {
    var viewportwidth;
    var viewportheight;

    // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight

    if (typeof window.innerWidth != 'undefined') {
        viewportwidth = window.innerWidth,
      viewportheight = window.innerHeight
    }

    // IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)

    else if (typeof document.documentElement != 'undefined'
     && typeof document.documentElement.clientWidth !=
     'undefined' && document.documentElement.clientWidth != 0) {
        viewportwidth = document.documentElement.clientWidth,
       viewportheight = document.documentElement.clientHeight
    }

    // older versions of IE

    else {
        viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
       viewportheight = document.getElementsByTagName('body')[0].clientHeight
    }
    return viewportwidth + 'X' + viewportheight;

}

// FM 2008-12-05
// Set all checkbox in the container "ctrl" to the checked parameter value.
function togglecheckbox(ctrl, blnchecked) {
    try {
        if (ctrl.type == 'checkbox') {
            ctrl.checked = blnchecked;
        }
    }
    catch (E) {
    }
    if (ctrl.childNodes && ctrl.childNodes.length > 0) {
        for (var x = 0; x < ctrl.childNodes.length; x++) {
            togglecheckbox(ctrl.childNodes[x], blnchecked);
        }
    }
}

var rollOverArr = new Array();

function setrollover(OverImgSrc, pageImageName) {
    if (!document.images) return;
    if (pageImageName == null)
        pageImageName = document.images[document.images.length - 1].name;
    rollOverArr[pageImageName] = new Object;
    rollOverArr[pageImageName].overImg = new Image;
    rollOverArr[pageImageName].overImg.src = OverImgSrc;
}

function rollover(pageImageName) {
    if (!document.images) return;
    if (!rollOverArr[pageImageName]) return;
    if (!rollOverArr[pageImageName].outImg) {
        rollOverArr[pageImageName].outImg = new Image;
        rollOverArr[pageImageName].outImg.src = document.images[pageImageName].src;
    }
    document.images[pageImageName].src = rollOverArr[pageImageName].overImg.src;
}

function rollout(pageImageName) {
    if (!document.images) return;
    if (!rollOverArr[pageImageName]) return;
    document.images[pageImageName].src = rollOverArr[pageImageName].outImg.src;
}


/*
Author: Addam M. Driver
Date: 10/31/2006
*/

var sMax; // Isthe maximum number of stars
var holder; // Is the holding pattern for clicked state
var preSet; // Is the PreSet value onces a selection has been made
var rated;

// Rollover for image Stars //
function rating(num) {
    sMax = 0; // Isthe maximum number of stars
    for (n = 0; n < num.parentNode.childNodes.length; n++) {
        if (num.parentNode.childNodes[n].nodeName == "A") {
            sMax++;
        }
    }

    if (!rated) {
        s = num.id.replace("_", ''); // Get the selected star
        a = 0;
        for (i = 1; i <= sMax; i++) {
            if (i <= s) {
                document.getElementById("_" + i).className = "on";
                document.getElementById("rateStatus").innerHTML = num.title;
                holder = a + 1;
                a++;
            } else {
                document.getElementById("_" + i).className = "";
            }
        }
    }
}

// For when you roll out of the the whole thing //
function off(me) {
    if (!rated) {
        if (!preSet) {
            for (i = 1; i <= sMax; i++) {
                document.getElementById("_" + i).className = "";
                document.getElementById("rateStatus").innerHTML = me.parentNode.title;
            }
        } else {
            rating(preSet);
            document.getElementById("rateStatus").innerHTML = document.getElementById("ratingSaved").innerHTML;
        }
    }
}

// When you actually rate something //
function rateIt(me) {
    if (!rated) {
        document.getElementById("rateStatus").innerHTML = document.getElementById("ratingSaved").innerHTML + " :: " + me.title;
        preSet = me;
        rated = 1;
        sendRate(me);
        rating(me);
    }
}

// Send the rating information somewhere using Ajax or something like that.
function sendRate(sel) {
    alert("Your rating was: " + sel.title);
}

/******************************************************************************************************/
//    <script src="<%= resolveclienturl("~/js/menu.js") %>" type="text/javascript"></script>
/******************************************************************************************************/
function toggleMenu(DivNum) {
    //closeAll(DivNum)
    var objID = 'menu' + DivNum

    if (!document.getElementById) return;
    var ob = document.getElementById(objID).style;

    var ObjImg = document.getElementById('DivArrow' + DivNum);

    if (ObjImg.className == 'MenuClose') {
        ObjImg.className = 'MenuOpen'
        ob.display = 'block'
        createCookie(objID, 1, 30)
    }
    else {
        ObjImg.className = 'MenuClose'
        ob.display = 'none'
        eraseCookie(objID)
    }

}
function openMenu(DivNum) {
    var objID = 'menu' + DivNum

    if (!document.getElementById) return;
    var ob = document.getElementById(objID).style;

    var ObjImg = document.getElementById('DivArrow' + DivNum);

    ObjImg.className = 'MenuOpen'
    ob.display = 'block'
    createCookie(objID, 1, 30)

}

function closeAll(DivNum) {
    var ob
    var ObjImg

    for (i = 0; i < 8; i++) {
        if (i + 1 != DivNum) {
            ob = document.getElementById('menu' + (i + 1)).style;

            ObjImg = document.getElementById('DivArrow' + (i + 1));
            ObjImg.className = 'MenuClose'
            ob.display = 'none'
            eraseCookie('menu' + (i + 1))
        }
    }
}


function createCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}




















function showDiv(divNumber) {
    // hide all div
    for (i = 1; i < 7; i++) {
        document.getElementById('divSelect' + i).style.display = 'none';
        document.getElementById('divBlock' + i).style.display = 'none';
    }
    document.getElementById('form').className = 'form' + divNumber;

    // display selected div
    document.getElementById('divBlock' + divNumber).style.display = 'inherit';
    document.getElementById('divSelect' + divNumber).style.display = 'inherit';
}

function showTab(divNumber) {
    // hide all div
    for (i = 1; i < 3; i++) {
        document.getElementById('tabSelect' + i).style.display = 'none';
        document.getElementById('tabBlock' + i).style.display = 'none';
    }

    // display selected div
    document.getElementById('tabSelect' + divNumber).style.display = 'inherit';
    document.getElementById('tabBlock' + divNumber).style.display = 'inherit';
}

function showSource(divNumber) {
    // hide all div
    for (i = 1; i < 4; i++) {
        document.getElementById('ctl00_CenterContent_SourceCode1_sourceSelect' + i).style.display = 'none';
        document.getElementById('sourceBlock' + i).style.display = 'none';
    }

    // display selected div
    document.getElementById('ctl00_CenterContent_SourceCode1_sourceSelect' + divNumber).style.display = 'inherit';
    document.getElementById('sourceBlock' + divNumber).style.display = 'inherit';
}

function showBuy(divNumber) {
    // hide all div
    for (i = 1; i < 6; i++) {
        document.getElementById('BuySourceSelect' + i).style.display = 'none';
        document.getElementById('BuySourceBlock' + i).style.display = 'none';
    }

    // display selected div
    document.getElementById('BuySourceSelect' + divNumber).style.display = 'inherit';
    document.getElementById('BuySourceBlock' + divNumber).style.display = 'inherit';
}

function showUpgrade(divNumber) {
    // hide all div
    for (i = 1; i < 4; i++) {
        document.getElementById('BuyUpgradeSelect' + i).style.display = 'none';
        document.getElementById('BuyUpgradeBlock' + i).style.display = 'none';
    }

    // display selected div
    document.getElementById('BuyUpgradeSelect' + divNumber).style.display = 'inherit';
    document.getElementById('BuyUpgradeBlock' + divNumber).style.display = 'inherit';
}

function userUpgrade(index, objForm) {
    for (i = objForm.to.length - 1; i > index - 2; i--) {
        objForm.to[i].disabled = 0
    }

    for (i = 0; i < index - 1; i++) {
        objForm.to[i].disabled = 1
        objForm.to[i].checked = 0
    }
}

function managePrice() {
    var arrPrice = new Array(44)
    var arrUserFrom = new Array(4)
    var arrUserTo = new Array(4)

    arrPrice[11] = 795
    arrPrice[12] = 1795
    arrPrice[13] = 2795
    arrPrice[14] = 3495
    arrPrice[22] = 1295
    arrPrice[23] = 2295
    arrPrice[24] = 2995
    arrPrice[33] = 1295
    arrPrice[34] = 1995
    arrPrice[44] = 995

    arrUserFrom[1] = 20
    arrUserFrom[2] = 50
    arrUserFrom[3] = 100
    arrUserFrom[4] = 250

    arrUserTo[1] = 50
    arrUserTo[2] = 100
    arrUserTo[3] = 250
    arrUserTo[4] = strUnlimited

    var objFrom = document.forms[0].from
    var objTo = document.forms[0].to
    var indFrom = selectedIndex(objFrom)
    var indTo = selectedIndex(objTo)
    var textResults = arrPrice[indFrom + '' + indTo]

    if (isNaN(textResults)) {
        textResults = '$0.00'
        document.getElementById('NBUserDiv').style.visibility = 'hidden'
    }
    else {
        textResults = '$' + textResults + '.00'
        document.getElementById('NBUserDiv').style.visibility = 'visible'
        document.getElementById('NBUserFrom').innerHTML = arrUserFrom[indFrom];
        document.getElementById('NBUserTo').innerHTML = arrUserTo[indTo];
    }

    document.getElementById('results').innerHTML = textResults;
}

function selectedIndex(objRadio) {
    for (i = 0; i < objRadio.length; i++) {
        if (objRadio[i].checked)
            return i + 1
    }
}








function showResourceForm(divNumber) {
    // hide all div
    for (i = 1; i < 2; i++) {
        document.getElementById('ResourceForm' + i).style.display = 'none';
    }

    // display selected div
    document.getElementById('ResourceForm' + divNumber).style.display = 'inherit';
}


/******************************************************************************************************/
//    <script src="<%= resolveclienturl("~/js/highslide-full.js") %>" type="text/javascript"></script>
/******************************************************************************************************/
/******************************************************************************
Name:    Highslide JS
Version: 4.1.7 (September 28 2009)
Config:  default +events +unobtrusive +imagemap +slideshow +positioning +transitions +viewport +thumbstrip +inline +ajax +iframe +flash
Author:  Torstein Hønsi
Support: http://highslide.com/support

Licence:
Highslide JS is licensed under a Creative Commons Attribution-NonCommercial 2.5
License (http://creativecommons.org/licenses/by-nc/2.5/).

You are free:
* to copy, distribute, display, and perform the work
* to make derivative works

Under the following conditions:
* Attribution. You must attribute the work in the manner  specified by  the
author or licensor.
* Noncommercial. You may not use this work for commercial purposes.

* For  any  reuse  or  distribution, you  must make clear to others the license
terms of this work.
* Any  of  these  conditions  can  be  waived  if  you  get permission from the 
copyright holder.

Your fair use and other rights are in no way affected by the above.
******************************************************************************/

//Width Height for Highslide Videos
//width:sd1[0], height:sd1[1]
// title1 = new Array('English', 'French/Spanish/German/etc...');

sd = new Array(980, 620);
hd = new Array(1300, 800);
ssd = new Array(1054, 740);

title1 = new Array('Features Overview - Project Management');
title2 = new Array('Features Overview - Resource Management');
title3 = new Array('Features Overview - Task Management');
title4 = new Array('Features Overview - Task Dependencies');
title8 = new Array('Features Overview - Time Tracking');
title12 = new Array('Features Overview - Document Management');
title19 = new Array('Features Overview - Discussion Forum');
title21 = new Array('Features Overview - Task Reminder');
title22 = new Array('Features Overview - Branding');
title23 = new Array('Version 4.8 Overview - News & Updates');
title24 = new Array('Version 4.7 Overview - News & Updates');
title25 = new Array('Version 4.6 Overview - News & Updates');
title26 = new Array('Version 4.5 Overview - News & Updates');


/** 
* Name:    Highslide JS
* Version: 4.1.9 (2010-07-05)
* Author:  Torstein HÃ¸nsi
* Support: www.highslide.com/support
* License: www.highslide.com/#license
*/
if (!hs) {
    var hs = {
        // Language strings
        lang: {
            cssDirection: 'ltr',
            loadingText: 'Loading...',
            loadingTitle: 'Click to cancel',
            focusTitle: 'Click to bring to front',
            fullExpandTitle: 'Expand to actual size (f)',
            creditsText: 'Powered by <i>Highslide JS</i>',
            creditsTitle: 'Go to the Highslide JS homepage',
            previousText: 'Previous',
            nextText: 'Next',
            moveText: 'Move',
            closeText: 'Close',
            closeTitle: 'Close (esc)',
            resizeTitle: 'Resize',
            playText: 'Play',
            playTitle: 'Play slideshow (spacebar)',
            pauseText: 'Pause',
            pauseTitle: 'Pause slideshow (spacebar)',
            previousTitle: 'Previous (arrow left)',
            nextTitle: 'Next (arrow right)',
            moveTitle: 'Move',
            fullExpandText: '1:1',
            number: 'Image %1 of %2',
            restoreTitle: 'Click to close image, click and drag to move.'
        },
        // See http://highslide.com/ref for examples of settings  
        graphicsDir: 'highslide/graphics/',
        expandCursor: 'zoomin.cur', // null disables
        restoreCursor: 'zoomout.cur', // null disables
        expandDuration: 250, // milliseconds
        restoreDuration: 250,
        marginLeft: 15,
        marginRight: 15,
        marginTop: 15,
        marginBottom: 15,
        zIndexCounter: 1001, // adjust to other absolutely positioned elements
        loadingOpacity: 0.75,
        allowMultipleInstances: true,
        numberOfImagesToPreload: 5,
        outlineWhileAnimating: 2, // 0 = never, 1 = always, 2 = HTML only 
        outlineStartOffset: 3, // ends at 10
        padToMinWidth: false, // pad the popup width to make room for wide caption
        fullExpandPosition: 'bottom right',
        fullExpandOpacity: 1,
        showCredits: true, // you can set this to false if you want
        creditsHref: 'http://highslide.com/',
        creditsTarget: '_self',
        enableKeyListener: true,
        openerTagNames: ['a', 'area'], // Add more to allow slideshow indexing
        transitions: [],
        transitionDuration: 250,
        dimmingOpacity: 0, // Lightbox style dimming background
        dimmingDuration: 50, // 0 for instant dimming

        allowWidthReduction: false,
        allowHeightReduction: true,
        preserveContent: true, // Preserve changes made to the content and position of HTML popups.
        objectLoadTime: 'before', // Load iframes 'before' or 'after' expansion.
        cacheAjax: true, // Cache ajax popups for instant display. Can be overridden for each popup.
        anchor: 'auto', // where the image expands from
        align: 'auto', // position in the client (overrides anchor)
        targetX: null, // the id of a target element
        targetY: null,
        dragByHeading: true,
        minWidth: 200,
        minHeight: 200,
        allowSizeReduction: true, // allow the image to reduce to fit client size. If false, this overrides minWidth and minHeight
        outlineType: 'drop-shadow', // set null to disable outlines
        skin: {
            controls:
		'<div class="highslide-controls"><ul>' +
			'<li class="highslide-previous">' +
				'<a href="#" title="{hs.lang.previousTitle}">' +
				'<span>{hs.lang.previousText}</span></a>' +
			'</li>' +
			'<li class="highslide-play">' +
				'<a href="#" title="{hs.lang.playTitle}">' +
				'<span>{hs.lang.playText}</span></a>' +
			'</li>' +
			'<li class="highslide-pause">' +
				'<a href="#" title="{hs.lang.pauseTitle}">' +
				'<span>{hs.lang.pauseText}</span></a>' +
			'</li>' +
			'<li class="highslide-next">' +
				'<a href="#" title="{hs.lang.nextTitle}">' +
				'<span>{hs.lang.nextText}</span></a>' +
			'</li>' +
			'<li class="highslide-move">' +
				'<a href="#" title="{hs.lang.moveTitle}">' +
				'<span>{hs.lang.moveText}</span></a>' +
			'</li>' +
			'<li class="highslide-full-expand">' +
				'<a href="#" title="{hs.lang.fullExpandTitle}">' +
				'<span>{hs.lang.fullExpandText}</span></a>' +
			'</li>' +
			'<li class="highslide-close">' +
				'<a href="#" title="{hs.lang.closeTitle}" >' +
				'<span>{hs.lang.closeText}</span></a>' +
			'</li>' +
		'</ul></div>'
	,
            contentWrapper:
		'<div class="highslide-header"><ul>' +
			'<li class="highslide-previous">' +
				'<a href="#" title="{hs.lang.previousTitle}" onclick="return hs.previous(this)">' +
				'<span>{hs.lang.previousText}</span></a>' +
			'</li>' +
			'<li class="highslide-next">' +
				'<a href="#" title="{hs.lang.nextTitle}" onclick="return hs.next(this)">' +
				'<span>{hs.lang.nextText}</span></a>' +
			'</li>' +
			'<li class="highslide-move">' +
				'<a href="#" title="{hs.lang.moveTitle}" onclick="return false">' +
				'<span>{hs.lang.moveText}</span></a>' +
			'</li>' +
			'<li class="highslide-close">' +
				'<a href="#" title="{hs.lang.closeTitle}" onclick="return hs.close(this)">' +
				'<span>{hs.lang.closeText}</span></a>' +
			'</li>' +
		'</ul></div>' +
		'<div class="highslide-body"></div>' +
		'<div class="highslide-footer"><div>' +
			'<span class="highslide-resize" title="{hs.lang.resizeTitle}"><span></span></span>' +
		'</div></div>'
        },
        // END OF YOUR SETTINGS


        // declare internal properties
        preloadTheseImages: [],
        continuePreloading: true,
        expanders: [],
        overrides: [
	'allowSizeReduction',
	'useBox',
	'anchor',
	'align',
	'targetX',
	'targetY',
	'outlineType',
	'outlineWhileAnimating',
	'captionId',
	'captionText',
	'captionEval',
	'captionOverlay',
	'headingId',
	'headingText',
	'headingEval',
	'headingOverlay',
	'creditsPosition',
	'dragByHeading',
	'autoplay',
	'numberPosition',
	'transitions',
	'dimmingOpacity',

	'width',
	'height',

	'contentId',
	'allowWidthReduction',
	'allowHeightReduction',
	'preserveContent',
	'maincontentId',
	'maincontentText',
	'maincontentEval',
	'objectType',
	'cacheAjax',
	'objectWidth',
	'objectHeight',
	'objectLoadTime',
	'swfOptions',
	'wrapperClassName',
	'minWidth',
	'minHeight',
	'maxWidth',
	'maxHeight',
	'pageOrigin',
	'slideshowGroup',
	'easing',
	'easingClose',
	'fadeInOut',
	'src'
],
        overlays: [],
        idCounter: 0,
        oPos: {
            x: ['leftpanel', 'left', 'center', 'right', 'rightpanel'],
            y: ['above', 'top', 'middle', 'bottom', 'below']
        },
        mouse: {},
        headingOverlay: {},
        captionOverlay: {},
        swfOptions: { flashvars: {}, params: {}, attributes: {} },
        timers: [],

        slideshows: [],

        pendingOutlines: {},
        sleeping: [],
        preloadTheseAjax: [],
        cacheBindings: [],
        cachedGets: {},
        clones: {},
        onReady: [],
        uaVersion: /Trident\/4\.0/.test(navigator.userAgent) ? 8 :
	parseFloat((navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [0, '0'])[1]),
        ie: (document.all && !window.opera),
        safari: /Safari/.test(navigator.userAgent),
        geckoMac: /Macintosh.+rv:1\.[0-8].+Gecko/.test(navigator.userAgent),

        $: function(id) {
            if (id) return document.getElementById(id);
        },

        push: function(arr, val) {
            arr[arr.length] = val;
        },

        createElement: function(tag, attribs, styles, parent, nopad) {
            var el = document.createElement(tag);
            if (attribs) hs.extend(el, attribs);
            if (nopad) hs.setStyles(el, { padding: 0, border: 'none', margin: 0 });
            if (styles) hs.setStyles(el, styles);
            if (parent) parent.appendChild(el);
            return el;
        },

        extend: function(el, attribs) {
            for (var x in attribs) el[x] = attribs[x];
            return el;
        },

        setStyles: function(el, styles) {
            for (var x in styles) {
                if (hs.ie && x == 'opacity') {
                    if (styles[x] > 0.99) el.style.removeAttribute('filter');
                    else el.style.filter = 'alpha(opacity=' + (styles[x] * 100) + ')';
                }
                else el.style[x] = styles[x];
            }
        },
        animate: function(el, prop, opt) {
            var start,
		end,
		unit;
            if (typeof opt != 'object' || opt === null) {
                var args = arguments;
                opt = {
                    duration: args[2],
                    easing: args[3],
                    complete: args[4]
                };
            }
            if (typeof opt.duration != 'number') opt.duration = 250;
            opt.easing = Math[opt.easing] || Math.easeInQuad;
            opt.curAnim = hs.extend({}, prop);
            for (var name in prop) {
                var e = new hs.fx(el, opt, name);

                start = parseFloat(hs.css(el, name)) || 0;
                end = parseFloat(prop[name]);
                unit = name != 'opacity' ? 'px' : '';

                e.custom(start, end, unit);
            }
        },
        css: function(el, prop) {
            if (el.style[prop]) {
                return el.style[prop];
            } else if (document.defaultView) {
                return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop);

            } else {
                if (prop == 'opacity') prop = 'filter';
                var val = el.currentStyle[prop.replace(/\-(\w)/g, function(a, b) { return b.toUpperCase(); })];
                if (prop == 'filter')
                    val = val.replace(/alpha\(opacity=([0-9]+)\)/,
				function(a, b) { return b / 100 });
                return val === '' ? 1 : val;
            }
        },

        getPageSize: function() {
            var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat'
		? d.documentElement : d.body;

            var width = hs.ie ? iebody.clientWidth :
			(d.documentElement.clientWidth || self.innerWidth),
		height = hs.ie ? iebody.clientHeight : self.innerHeight;

            hs.page = {
                width: width,
                height: height,
                scrollLeft: hs.ie ? iebody.scrollLeft : pageXOffset,
                scrollTop: hs.ie ? iebody.scrollTop : pageYOffset
            };
            return hs.page;
        },

        getPosition: function(el) {
            if (/area/i.test(el.tagName)) {
                var imgs = document.getElementsByTagName('img');
                for (var i = 0; i < imgs.length; i++) {
                    var u = imgs[i].useMap;
                    if (u && u.replace(/^.*?#/, '') == el.parentNode.name) {
                        el = imgs[i];
                        break;
                    }
                }
            }
            var p = { x: el.offsetLeft, y: el.offsetTop };
            while (el.offsetParent) {
                el = el.offsetParent;
                p.x += el.offsetLeft;
                p.y += el.offsetTop;
                if (el != document.body && el != document.documentElement) {
                    p.x -= el.scrollLeft;
                    p.y -= el.scrollTop;
                }
            }
            return p;
        },

        expand: function(a, params, custom, type) {
            if (!a) a = hs.createElement('a', null, { display: 'none' }, hs.container);
            if (typeof a.getParams == 'function') return params;
            if (type == 'html') {
                for (var i = 0; i < hs.sleeping.length; i++) {
                    if (hs.sleeping[i] && hs.sleeping[i].a == a) {
                        hs.sleeping[i].awake();
                        hs.sleeping[i] = null;
                        return false;
                    }
                }
                hs.hasHtmlExpanders = true;
            }
            try {
                new hs.Expander(a, params, custom, type);
                return false;
            } catch (e) { return true; }
        },

        htmlExpand: function(a, params, custom) {
            return hs.expand(a, params, custom, 'html');
        },

        getSelfRendered: function() {
            return hs.createElement('div', {
                className: 'highslide-html-content',
                innerHTML: hs.replaceLang(hs.skin.contentWrapper)
            });
        },
        getElementByClass: function(el, tagName, className) {
            var els = el.getElementsByTagName(tagName);
            for (var i = 0; i < els.length; i++) {
                if ((new RegExp(className)).test(els[i].className)) {
                    return els[i];
                }
            }
            return null;
        },
        replaceLang: function(s) {
            s = s.replace(/\s/g, ' ');
            var re = /{hs\.lang\.([^}]+)\}/g,
		matches = s.match(re),
		lang;
            if (matches) for (var i = 0; i < matches.length; i++) {
                lang = matches[i].replace(re, "$1");
                if (typeof hs.lang[lang] != 'undefined') s = s.replace(matches[i], hs.lang[lang]);
            }
            return s;
        },


        setClickEvents: function() {
            var els = document.getElementsByTagName('a');
            for (var i = 0; i < els.length; i++) {
                var type = hs.isUnobtrusiveAnchor(els[i]);
                if (type && !els[i].hsHasSetClick) {
                    (function() {
                        var t = type;
                        if (hs.fireEvent(hs, 'onSetClickEvent', { element: els[i], type: t })) {
                            els[i].onclick = (type == 'image') ? function() { return hs.expand(this) } :
						function() { return hs.htmlExpand(this, { objectType: t }); };
                        }
                    })();
                    els[i].hsHasSetClick = true;
                }
            }
            hs.getAnchors();
        },
        isUnobtrusiveAnchor: function(el) {
            if (el.rel == 'highslide') return 'image';
            else if (el.rel == 'highslide-ajax') return 'ajax';
            else if (el.rel == 'highslide-iframe') return 'iframe';
            else if (el.rel == 'highslide-swf') return 'swf';
        },

        getCacheBinding: function(a) {
            for (var i = 0; i < hs.cacheBindings.length; i++) {
                if (hs.cacheBindings[i][0] == a) {
                    var c = hs.cacheBindings[i][1];
                    hs.cacheBindings[i][1] = c.cloneNode(1);
                    return c;
                }
            }
            return null;
        },

        preloadAjax: function(e) {
            var arr = hs.getAnchors();
            for (var i = 0; i < arr.htmls.length; i++) {
                var a = arr.htmls[i];
                if (hs.getParam(a, 'objectType') == 'ajax' && hs.getParam(a, 'cacheAjax'))
                    hs.push(hs.preloadTheseAjax, a);
            }

            hs.preloadAjaxElement(0);
        },

        preloadAjaxElement: function(i) {
            if (!hs.preloadTheseAjax[i]) return;
            var a = hs.preloadTheseAjax[i];
            var cache = hs.getNode(hs.getParam(a, 'contentId'));
            if (!cache) cache = hs.getSelfRendered();
            var ajax = new hs.Ajax(a, cache, 1);
            ajax.onError = function() { };
            ajax.onLoad = function() {
                hs.push(hs.cacheBindings, [a, cache]);
                hs.preloadAjaxElement(i + 1);
            };
            ajax.run();
        },

        focusTopmost: function() {
            var topZ = 0,
		topmostKey = -1,
		expanders = hs.expanders,
		exp,
		zIndex;
            for (var i = 0; i < expanders.length; i++) {
                exp = expanders[i];
                if (exp) {
                    zIndex = exp.wrapper.style.zIndex;
                    if (zIndex && zIndex > topZ) {
                        topZ = zIndex;
                        topmostKey = i;
                    }
                }
            }
            if (topmostKey == -1) hs.focusKey = -1;
            else expanders[topmostKey].focus();
        },

        getParam: function(a, param) {
            a.getParams = a.onclick;
            var p = a.getParams ? a.getParams() : null;
            a.getParams = null;

            return (p && typeof p[param] != 'undefined') ? p[param] :
		(typeof hs[param] != 'undefined' ? hs[param] : null);
        },

        getSrc: function(a) {
            var src = hs.getParam(a, 'src');
            if (src) return src;
            return a.href;
        },

        getNode: function(id) {
            var node = hs.$(id), clone = hs.clones[id], a = {};
            if (!node && !clone) return null;
            if (!clone) {
                clone = node.cloneNode(true);
                clone.id = '';
                hs.clones[id] = clone;
                return node;
            } else {
                return clone.cloneNode(true);
            }
        },

        discardElement: function(d) {
            if (d) hs.garbageBin.appendChild(d);
            hs.garbageBin.innerHTML = '';
        },
        dim: function(exp) {
            if (!hs.dimmer) {
                hs.dimmer = hs.createElement('div', {
                    className: 'highslide-dimming highslide-viewport-size',
                    owner: '',
                    onclick: function() {
                        if (hs.fireEvent(hs, 'onDimmerClick'))

                            hs.close();
                    }
                }, {
                    visibility: 'visible',
                    opacity: 0
                }, hs.container, true);
            }

            hs.dimmer.style.display = '';

            hs.dimmer.owner += '|' + exp.key;
            if (hs.geckoMac && hs.dimmingGeckoFix)
                hs.setStyles(hs.dimmer, {
                    background: 'url(' + hs.graphicsDir + 'geckodimmer.png)',
                    opacity: 1
                });
            else
                hs.animate(hs.dimmer, { opacity: exp.dimmingOpacity }, hs.dimmingDuration);
        },
        undim: function(key) {
            if (!hs.dimmer) return;
            if (typeof key != 'undefined') hs.dimmer.owner = hs.dimmer.owner.replace('|' + key, '');

            if (
		(typeof key != 'undefined' && hs.dimmer.owner != '')
		|| (hs.upcoming && hs.getParam(hs.upcoming, 'dimmingOpacity'))
	) return;

            if (hs.geckoMac && hs.dimmingGeckoFix) hs.dimmer.style.display = 'none';
            else hs.animate(hs.dimmer, { opacity: 0 }, hs.dimmingDuration, null, function() {
                hs.dimmer.style.display = 'none';
            });
        },
        transit: function(adj, exp) {
            var last = exp || hs.getExpander();
            exp = last;
            if (hs.upcoming) return false;
            else hs.last = last;
            hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
            try {
                hs.upcoming = adj;
                adj.onclick();
            } catch (e) {
                hs.last = hs.upcoming = null;
            }
            try {
                if (!adj || exp.transitions[1] != 'crossfade')
                    exp.close();
            } catch (e) { }
            return false;
        },

        previousOrNext: function(el, op) {
            var exp = hs.getExpander(el);
            if (exp) return hs.transit(exp.getAdjacentAnchor(op), exp);
            else return false;
        },

        previous: function(el) {
            return hs.previousOrNext(el, -1);
        },

        next: function(el) {
            return hs.previousOrNext(el, 1);
        },

        keyHandler: function(e) {
            if (!e) e = window.event;
            if (!e.target) e.target = e.srcElement; // ie
            if (typeof e.target.form != 'undefined') return true; // form element has focus
            if (!hs.fireEvent(hs, 'onKeyDown', e)) return true;
            var exp = hs.getExpander();

            var op = null;
            switch (e.keyCode) {
                case 70: // f
                    if (exp) exp.doFullExpand();
                    return true;
                case 32: // Space
                    op = 2;
                    break;
                case 34: // Page Down
                case 39: // Arrow right
                case 40: // Arrow down
                    op = 1;
                    break;
                case 8:  // Backspace
                case 33: // Page Up
                case 37: // Arrow left
                case 38: // Arrow up
                    op = -1;
                    break;
                case 27: // Escape
                case 13: // Enter
                    op = 0;
            }
            if (op !== null) {
                hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
                if (!hs.enableKeyListener) return true;

                if (e.preventDefault) e.preventDefault();
                else e.returnValue = false;
                if (exp) {
                    if (op == 0) {
                        exp.close();
                    } else if (op == 2) {
                        if (exp.slideshow) exp.slideshow.hitSpace();
                    } else {
                        if (exp.slideshow) exp.slideshow.pause();
                        hs.previousOrNext(exp.key, op);
                    }
                    return false;
                }
            }
            return true;
        },


        registerOverlay: function(overlay) {
            hs.push(hs.overlays, hs.extend(overlay, { hsId: 'hsId' + hs.idCounter++ }));
        },


        addSlideshow: function(options) {
            var sg = options.slideshowGroup;
            if (typeof sg == 'object') {
                for (var i = 0; i < sg.length; i++) {
                    var o = {};
                    for (var x in options) o[x] = options[x];
                    o.slideshowGroup = sg[i];
                    hs.push(hs.slideshows, o);
                }
            } else {
                hs.push(hs.slideshows, options);
            }
        },

        getWrapperKey: function(element, expOnly) {
            var el, re = /^highslide-wrapper-([0-9]+)$/;
            // 1. look in open expanders
            el = element;
            while (el.parentNode) {
                if (el.hsKey !== undefined) return el.hsKey;
                if (el.id && re.test(el.id)) return el.id.replace(re, "$1");
                el = el.parentNode;
            }
            // 2. look in thumbnail
            if (!expOnly) {
                el = element;
                while (el.parentNode) {
                    if (el.tagName && hs.isHsAnchor(el)) {
                        for (var key = 0; key < hs.expanders.length; key++) {
                            var exp = hs.expanders[key];
                            if (exp && exp.a == el) return key;
                        }
                    }
                    el = el.parentNode;
                }
            }
            return null;
        },

        getExpander: function(el, expOnly) {
            if (typeof el == 'undefined') return hs.expanders[hs.focusKey] || null;
            if (typeof el == 'number') return hs.expanders[el] || null;
            if (typeof el == 'string') el = hs.$(el);
            return hs.expanders[hs.getWrapperKey(el, expOnly)] || null;
        },

        isHsAnchor: function(a) {
            return (a.onclick && a.onclick.toString().replace(/\s/g, ' ').match(/hs.(htmlE|e)xpand/));
        },

        reOrder: function() {
            for (var i = 0; i < hs.expanders.length; i++)
                if (hs.expanders[i] && hs.expanders[i].isExpanded) hs.focusTopmost();
        },
        fireEvent: function(obj, evt, args) {
            return obj && obj[evt] ? (obj[evt](obj, args) !== false) : true;
        },

        mouseClickHandler: function(e) {
            if (!e) e = window.event;
            if (e.button > 1) return true;
            if (!e.target) e.target = e.srcElement;

            var el = e.target;
            while (el.parentNode
		&& !(/highslide-(image|move|html|resize)/.test(el.className))) {
                el = el.parentNode;
            }
            var exp = hs.getExpander(el);
            if (exp && (exp.isClosing || !exp.isExpanded)) return true;

            if (exp && e.type == 'mousedown') {
                if (e.target.form) return true;
                var match = el.className.match(/highslide-(image|move|resize)/);
                if (match) {
                    hs.dragArgs = {
                        exp: exp,
                        type: match[1],
                        left: exp.x.pos,
                        width: exp.x.size,
                        top: exp.y.pos,
                        height: exp.y.size,
                        clickX: e.clientX,
                        clickY: e.clientY
                    };


                    hs.addEventListener(document, 'mousemove', hs.dragHandler);
                    if (e.preventDefault) e.preventDefault(); // FF

                    if (/highslide-(image|html)-blur/.test(exp.content.className)) {
                        exp.focus();
                        hs.hasFocused = true;
                    }
                    return false;
                }
                else if (/highslide-html/.test(el.className) && hs.focusKey != exp.key) {
                    exp.focus();
                    exp.doShowHide('hidden');
                }
            } else if (e.type == 'mouseup') {

                hs.removeEventListener(document, 'mousemove', hs.dragHandler);

                if (hs.dragArgs) {
                    if (hs.styleRestoreCursor && hs.dragArgs.type == 'image')
                        hs.dragArgs.exp.content.style.cursor = hs.styleRestoreCursor;
                    var hasDragged = hs.dragArgs.hasDragged;

                    if (!hasDragged && !hs.hasFocused && !/(move|resize)/.test(hs.dragArgs.type)) {
                        if (hs.fireEvent(exp, 'onImageClick'))
                            exp.close();
                    }
                    else if (hasDragged || (!hasDragged && hs.hasHtmlExpanders)) {
                        hs.dragArgs.exp.doShowHide('hidden');
                    }

                    if (hs.dragArgs.exp.releaseMask)
                        hs.dragArgs.exp.releaseMask.style.display = 'none';

                    if (hasDragged) hs.fireEvent(hs.dragArgs.exp, 'onDrop', hs.dragArgs);
                    hs.hasFocused = false;
                    hs.dragArgs = null;

                } else if (/highslide-image-blur/.test(el.className)) {
                    el.style.cursor = hs.styleRestoreCursor;
                }
            }
            return false;
        },

        dragHandler: function(e) {
            if (!hs.dragArgs) return true;
            if (!e) e = window.event;
            var a = hs.dragArgs, exp = a.exp;
            if (exp.iframe) {
                if (!exp.releaseMask) exp.releaseMask = hs.createElement('div', null,
			{ position: 'absolute', width: exp.x.size + 'px', height: exp.y.size + 'px',
			    left: exp.x.cb + 'px', top: exp.y.cb + 'px', zIndex: 4, background: (hs.ie ? 'white' : 'none'),
			    opacity: 0.01
			},
			exp.wrapper, true);
                if (exp.releaseMask.style.display == 'none')
                    exp.releaseMask.style.display = '';
            }

            a.dX = e.clientX - a.clickX;
            a.dY = e.clientY - a.clickY;

            var distance = Math.sqrt(Math.pow(a.dX, 2) + Math.pow(a.dY, 2));
            if (!a.hasDragged) a.hasDragged = (a.type != 'image' && distance > 0)
		|| (distance > (hs.dragSensitivity || 5));

            if (a.hasDragged && e.clientX > 5 && e.clientY > 5) {
                if (!hs.fireEvent(exp, 'onDrag', a)) return false;

                if (a.type == 'resize') exp.resize(a);
                else {
                    exp.moveTo(a.left + a.dX, a.top + a.dY);
                    if (a.type == 'image') exp.content.style.cursor = 'move';
                }
            }
            return false;
        },

        wrapperMouseHandler: function(e) {
            try {
                if (!e) e = window.event;
                var over = /mouseover/i.test(e.type);
                if (!e.target) e.target = e.srcElement; // ie
                if (hs.ie) e.relatedTarget =
			over ? e.fromElement : e.toElement; // ie
                var exp = hs.getExpander(e.target);
                if (!exp.isExpanded) return;
                if (!exp || !e.relatedTarget || hs.getExpander(e.relatedTarget, true) == exp
			|| hs.dragArgs) return;
                hs.fireEvent(exp, over ? 'onMouseOver' : 'onMouseOut', e);
                for (var i = 0; i < exp.overlays.length; i++) (function() {
                    var o = hs.$('hsId' + exp.overlays[i]);
                    if (o && o.hideOnMouseOut) {
                        if (over) hs.setStyles(o, { visibility: 'visible', display: '' });
                        hs.animate(o, { opacity: over ? o.opacity : 0 }, o.dur);
                    }
                })();
            } catch (e) { }
        },
        addEventListener: function(el, event, func) {
            if (el == document && event == 'ready') {
                hs.push(hs.onReady, func);
            }
            try {
                el.addEventListener(event, func, false);
            } catch (e) {
                try {
                    el.detachEvent('on' + event, func);
                    el.attachEvent('on' + event, func);
                } catch (e) {
                    el['on' + event] = func;
                }
            }
        },

        removeEventListener: function(el, event, func) {
            try {
                el.removeEventListener(event, func, false);
            } catch (e) {
                try {
                    el.detachEvent('on' + event, func);
                } catch (e) {
                    el['on' + event] = null;
                }
            }
        },

        preloadFullImage: function(i) {
            if (hs.continuePreloading && hs.preloadTheseImages[i] && hs.preloadTheseImages[i] != 'undefined') {
                var img = document.createElement('img');
                img.onload = function() {
                    img = null;
                    hs.preloadFullImage(i + 1);
                };
                img.src = hs.preloadTheseImages[i];
            }
        },
        preloadImages: function(number) {
            if (number && typeof number != 'object') hs.numberOfImagesToPreload = number;

            var arr = hs.getAnchors();
            for (var i = 0; i < arr.images.length && i < hs.numberOfImagesToPreload; i++) {
                hs.push(hs.preloadTheseImages, hs.getSrc(arr.images[i]));
            }

            // preload outlines
            if (hs.outlineType) new hs.Outline(hs.outlineType, function() { hs.preloadFullImage(0) });
            else

                hs.preloadFullImage(0);

            // preload cursor
            if (hs.restoreCursor) var cur = hs.createElement('img', { src: hs.graphicsDir + hs.restoreCursor });
        },


        init: function() {
            if (!hs.container) {

                hs.getPageSize();
                hs.ieLt7 = hs.ie && hs.uaVersion < 7;
                hs.ie6SSL = hs.ieLt7 && location.protocol == 'https:';
                for (var x in hs.langDefaults) {
                    if (typeof hs[x] != 'undefined') hs.lang[x] = hs[x];
                    else if (typeof hs.lang[x] == 'undefined' && typeof hs.langDefaults[x] != 'undefined')
                        hs.lang[x] = hs.langDefaults[x];
                }

                hs.container = hs.createElement('div', {
                    className: 'highslide-container'
                }, {
                    position: 'absolute',
                    left: 0,
                    top: 0,
                    width: '100%',
                    zIndex: hs.zIndexCounter,
                    direction: 'ltr'
                },
			document.body,
			true
		);
                hs.loading = hs.createElement('a', {
                    className: 'highslide-loading',
                    title: hs.lang.loadingTitle,
                    innerHTML: hs.lang.loadingText,
                    href: 'javascript:;'
                }, {
                    position: 'absolute',
                    top: '-9999px',
                    opacity: hs.loadingOpacity,
                    zIndex: 1
                }, hs.container
		);
                hs.garbageBin = hs.createElement('div', null, { display: 'none' }, hs.container);
                hs.viewport = hs.createElement('div', {
                    className: 'highslide-viewport highslide-viewport-size'
                }, {
                    visibility: (hs.safari && hs.uaVersion < 525) ? 'visible' : 'hidden'
                }, hs.container, 1
		);
                hs.clearing = hs.createElement('div', null,
			{ clear: 'both', paddingTop: '1px' }, null, true);

                // http://www.robertpenner.com/easing/ 
                Math.linearTween = function(t, b, c, d) {
                    return c * t / d + b;
                };
                Math.easeInQuad = function(t, b, c, d) {
                    return c * (t /= d) * t + b;
                };
                Math.easeOutQuad = function(t, b, c, d) {
                    return -c * (t /= d) * (t - 2) + b;
                };

                hs.hideSelects = hs.ieLt7;
                hs.hideIframes = ((window.opera && hs.uaVersion < 9) || navigator.vendor == 'KDE'
			|| (hs.ie && hs.uaVersion < 5.5));
                hs.fireEvent(this, 'onActivate');
            }
        },
        ready: function() {
            if (hs.isReady) return;
            hs.isReady = true;
            for (var i = 0; i < hs.onReady.length; i++) hs.onReady[i]();
        },

        updateAnchors: function() {
            var el, els, all = [], images = [], htmls = [], groups = {}, re;

            for (var i = 0; i < hs.openerTagNames.length; i++) {
                els = document.getElementsByTagName(hs.openerTagNames[i]);
                for (var j = 0; j < els.length; j++) {
                    el = els[j];
                    re = hs.isHsAnchor(el);
                    if (re) {
                        hs.push(all, el);
                        if (re[0] == 'hs.expand') hs.push(images, el);
                        else if (re[0] == 'hs.htmlExpand') hs.push(htmls, el);
                        var g = hs.getParam(el, 'slideshowGroup') || 'none';
                        if (!groups[g]) groups[g] = [];
                        hs.push(groups[g], el);
                    }
                }
            }
            hs.anchors = { all: all, groups: groups, images: images, htmls: htmls };
            return hs.anchors;

        },

        getAnchors: function() {
            return hs.anchors || hs.updateAnchors();
        },


        close: function(el) {
            var exp = hs.getExpander(el);
            if (exp) exp.close();
            return false;
        }
    }; // end hs object
    hs.fx = function(elem, options, prop) {
        this.options = options;
        this.elem = elem;
        this.prop = prop;

        if (!options.orig) options.orig = {};
    };
    hs.fx.prototype = {
        update: function() {
            (hs.fx.step[this.prop] || hs.fx.step._default)(this);

            if (this.options.step)
                this.options.step.call(this.elem, this.now, this);

        },
        custom: function(from, to, unit) {
            this.startTime = (new Date()).getTime();
            this.start = from;
            this.end = to;
            this.unit = unit; // || this.unit || "px";
            this.now = this.start;
            this.pos = this.state = 0;

            var self = this;
            function t(gotoEnd) {
                return self.step(gotoEnd);
            }

            t.elem = this.elem;

            if (t() && hs.timers.push(t) == 1) {
                hs.timerId = setInterval(function() {
                    var timers = hs.timers;

                    for (var i = 0; i < timers.length; i++)
                        if (!timers[i]())
                        timers.splice(i--, 1);

                    if (!timers.length) {
                        clearInterval(hs.timerId);
                    }
                }, 13);
            }
        },
        step: function(gotoEnd) {
            var t = (new Date()).getTime();
            if (gotoEnd || t >= this.options.duration + this.startTime) {
                this.now = this.end;
                this.pos = this.state = 1;
                this.update();

                this.options.curAnim[this.prop] = true;

                var done = true;
                for (var i in this.options.curAnim)
                    if (this.options.curAnim[i] !== true)
                    done = false;

                if (done) {
                    if (this.options.complete) this.options.complete.call(this.elem);
                }
                return false;
            } else {
                var n = t - this.startTime;
                this.state = n / this.options.duration;
                this.pos = this.options.easing(n, 0, 1, this.options.duration);
                this.now = this.start + ((this.end - this.start) * this.pos);
                this.update();
            }
            return true;
        }

    };

    hs.extend(hs.fx, {
        step: {

            opacity: function(fx) {
                hs.setStyles(fx.elem, { opacity: fx.now });
            },

            _default: function(fx) {
                try {
                    if (fx.elem.style && fx.elem.style[fx.prop] != null)
                        fx.elem.style[fx.prop] = fx.now + fx.unit;
                    else
                        fx.elem[fx.prop] = fx.now;
                } catch (e) { }
            }
        }
    });

    hs.Outline = function(outlineType, onLoad) {
        this.onLoad = onLoad;
        this.outlineType = outlineType;
        var v = hs.uaVersion, tr;

        this.hasAlphaImageLoader = hs.ie && v >= 5.5 && v < 7;
        if (!outlineType) {
            if (onLoad) onLoad();
            return;
        }

        hs.init();
        this.table = hs.createElement(
		'table', {
		    cellSpacing: 0
		}, {
		    visibility: 'hidden',
		    position: 'absolute',
		    borderCollapse: 'collapse',
		    width: 0
		},
		hs.container,
		true
	);
        var tbody = hs.createElement('tbody', null, null, this.table, 1);

        this.td = [];
        for (var i = 0; i <= 8; i++) {
            if (i % 3 == 0) tr = hs.createElement('tr', null, { height: 'auto' }, tbody, true);
            this.td[i] = hs.createElement('td', null, null, tr, true);
            var style = i != 4 ? { lineHeight: 0, fontSize: 0} : { position: 'relative' };
            hs.setStyles(this.td[i], style);
        }
        this.td[4].className = outlineType + ' highslide-outline';

        this.preloadGraphic();
    };

    hs.Outline.prototype = {
        preloadGraphic: function() {
            var src = hs.graphicsDir + (hs.outlinesDir || "outlines/") + this.outlineType + ".png";

            var appendTo = hs.safari && hs.uaVersion < 525 ? hs.container : null;
            this.graphic = hs.createElement('img', null, { position: 'absolute',
                top: '-9999px'
            }, appendTo, true); // for onload trigger

            var pThis = this;
            this.graphic.onload = function() { pThis.onGraphicLoad(); };

            this.graphic.src = src;
        },

        onGraphicLoad: function() {
            var o = this.offset = this.graphic.width / 4,
		pos = [[0, 0], [0, -4], [-2, 0], [0, -8], 0, [-2, -8], [0, -2], [0, -6], [-2, -2]],
		dim = { height: (2 * o) + 'px', width: (2 * o) + 'px' };
            for (var i = 0; i <= 8; i++) {
                if (pos[i]) {
                    if (this.hasAlphaImageLoader) {
                        var w = (i == 1 || i == 7) ? '100%' : this.graphic.width + 'px';
                        var div = hs.createElement('div', null, { width: '100%', height: '100%', position: 'relative', overflow: 'hidden' }, this.td[i], true);
                        hs.createElement('div', null, {
                            filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src='" + this.graphic.src + "')",
                            position: 'absolute',
                            width: w,
                            height: this.graphic.height + 'px',
                            left: (pos[i][0] * o) + 'px',
                            top: (pos[i][1] * o) + 'px'
                        },
				div,
				true);
                    } else {
                        hs.setStyles(this.td[i], { background: 'url(' + this.graphic.src + ') ' + (pos[i][0] * o) + 'px ' + (pos[i][1] * o) + 'px' });
                    }

                    if (window.opera && (i == 3 || i == 5))
                        hs.createElement('div', null, dim, this.td[i], true);

                    hs.setStyles(this.td[i], dim);
                }
            }
            this.graphic = null;
            if (hs.pendingOutlines[this.outlineType]) hs.pendingOutlines[this.outlineType].destroy();
            hs.pendingOutlines[this.outlineType] = this;
            if (this.onLoad) this.onLoad();
        },

        setPosition: function(pos, offset, vis, dur, easing) {
            var exp = this.exp,
		stl = exp.wrapper.style,
		offset = offset || 0,
		pos = pos || {
		    x: exp.x.pos + offset,
		    y: exp.y.pos + offset,
		    w: exp.x.get('wsize') - 2 * offset,
		    h: exp.y.get('wsize') - 2 * offset
		};
            if (vis) this.table.style.visibility = (pos.h >= 4 * this.offset)
		? 'visible' : 'hidden';
            hs.setStyles(this.table, {
                left: (pos.x - this.offset) + 'px',
                top: (pos.y - this.offset) + 'px',
                width: (pos.w + 2 * this.offset) + 'px'
            });

            pos.w -= 2 * this.offset;
            pos.h -= 2 * this.offset;
            hs.setStyles(this.td[4], {
                width: pos.w >= 0 ? pos.w + 'px' : 0,
                height: pos.h >= 0 ? pos.h + 'px' : 0
            });
            if (this.hasAlphaImageLoader) this.td[3].style.height
		= this.td[5].style.height = this.td[4].style.height;

        },

        destroy: function(hide) {
            if (hide) this.table.style.visibility = 'hidden';
            else hs.discardElement(this.table);
        }
    };

    hs.Dimension = function(exp, dim) {
        this.exp = exp;
        this.dim = dim;
        this.ucwh = dim == 'x' ? 'Width' : 'Height';
        this.wh = this.ucwh.toLowerCase();
        this.uclt = dim == 'x' ? 'Left' : 'Top';
        this.lt = this.uclt.toLowerCase();
        this.ucrb = dim == 'x' ? 'Right' : 'Bottom';
        this.rb = this.ucrb.toLowerCase();
        this.p1 = this.p2 = 0;
    };
    hs.Dimension.prototype = {
        get: function(key) {
            switch (key) {
                case 'loadingPos':
                    return this.tpos + this.tb + (this.t - hs.loading['offset' + this.ucwh]) / 2;
                case 'loadingPosXfade':
                    return this.pos + this.cb + this.p1 + (this.size - hs.loading['offset' + this.ucwh]) / 2;
                case 'wsize':
                    return this.size + 2 * this.cb + this.p1 + this.p2;
                case 'fitsize':
                    return this.clientSize - this.marginMin - this.marginMax;
                case 'maxsize':
                    return this.get('fitsize') - 2 * this.cb - this.p1 - this.p2;
                case 'opos':
                    return this.pos - (this.exp.outline ? this.exp.outline.offset : 0);
                case 'osize':
                    return this.get('wsize') + (this.exp.outline ? 2 * this.exp.outline.offset : 0);
                case 'imgPad':
                    return this.imgSize ? Math.round((this.size - this.imgSize) / 2) : 0;

            }
        },
        calcBorders: function() {
            // correct for borders
            this.cb = (this.exp.content['offset' + this.ucwh] - this.t) / 2;

            this.marginMax = hs['margin' + this.ucrb];
        },
        calcThumb: function() {
            this.t = this.exp.el[this.wh] ? parseInt(this.exp.el[this.wh]) :
		this.exp.el['offset' + this.ucwh];
            this.tpos = this.exp.tpos[this.dim];
            this.tb = (this.exp.el['offset' + this.ucwh] - this.t) / 2;
            if (this.tpos == 0 || this.tpos == -1) {
                this.tpos = (hs.page[this.wh] / 2) + hs.page['scroll' + this.uclt];
            };
        },
        calcExpanded: function() {
            var exp = this.exp;
            this.justify = 'auto';

            // get alignment
            if (exp.align == 'center') this.justify = 'center';
            else if (new RegExp(this.lt).test(exp.anchor)) this.justify = null;
            else if (new RegExp(this.rb).test(exp.anchor)) this.justify = 'max';


            // size and position
            this.pos = this.tpos - this.cb + this.tb;

            if (this.maxHeight && this.dim == 'x')
                exp.maxWidth = Math.min(exp.maxWidth || this.full, exp.maxHeight * this.full / exp.y.full);

            this.size = Math.min(this.full, exp['max' + this.ucwh] || this.full);
            this.minSize = exp.allowSizeReduction ?
		Math.min(exp['min' + this.ucwh], this.full) : this.full;
            if (exp.isImage && exp.useBox) {
                this.size = exp[this.wh];
                this.imgSize = this.full;
            }
            if (this.dim == 'x' && hs.padToMinWidth) this.minSize = exp.minWidth;
            this.target = exp['target' + this.dim.toUpperCase()];
            this.marginMin = hs['margin' + this.uclt];
            this.scroll = hs.page['scroll' + this.uclt];
            this.clientSize = hs.page[this.wh];
        },
        setSize: function(i) {
            var exp = this.exp;
            if (exp.isImage && (exp.useBox || hs.padToMinWidth)) {
                this.imgSize = i;
                this.size = Math.max(this.size, this.imgSize);
                exp.content.style[this.lt] = this.get('imgPad') + 'px';
            } else
                this.size = i;

            exp.content.style[this.wh] = i + 'px';
            exp.wrapper.style[this.wh] = this.get('wsize') + 'px';
            if (exp.outline) exp.outline.setPosition();
            if (exp.releaseMask) exp.releaseMask.style[this.wh] = i + 'px';
            if (this.dim == 'y' && exp.iDoc && exp.body.style.height != 'auto') try {
                exp.iDoc.body.style.overflow = 'auto';
            } catch (e) { }
            if (exp.isHtml) {
                var d = exp.scrollerDiv;
                if (this.sizeDiff === undefined)
                    this.sizeDiff = exp.innerContent['offset' + this.ucwh] - d['offset' + this.ucwh];
                d.style[this.wh] = (this.size - this.sizeDiff) + 'px';

                if (this.dim == 'x') exp.mediumContent.style.width = 'auto';
                if (exp.body) exp.body.style[this.wh] = 'auto';
            }
            if (this.dim == 'x' && exp.overlayBox) exp.sizeOverlayBox(true);
            if (this.dim == 'x' && exp.slideshow && exp.isImage) {
                if (i == this.full) exp.slideshow.disable('full-expand');
                else exp.slideshow.enable('full-expand');
            }
        },
        setPos: function(i) {
            this.pos = i;
            this.exp.wrapper.style[this.lt] = i + 'px';

            if (this.exp.outline) this.exp.outline.setPosition();

        }
    };

    hs.Expander = function(a, params, custom, contentType) {
        if (document.readyState && hs.ie && !hs.isReady) {
            hs.addEventListener(document, 'ready', function() {
                new hs.Expander(a, params, custom, contentType);
            });
            return;
        }
        this.a = a;
        this.custom = custom;
        this.contentType = contentType || 'image';
        this.isHtml = (contentType == 'html');
        this.isImage = !this.isHtml;

        hs.continuePreloading = false;
        this.overlays = [];
        this.last = hs.last;
        hs.last = null;
        hs.init();
        var key = this.key = hs.expanders.length;
        // override inline parameters
        for (var i = 0; i < hs.overrides.length; i++) {
            var name = hs.overrides[i];
            this[name] = params && typeof params[name] != 'undefined' ?
			params[name] : hs[name];
        }
        if (!this.src) this.src = a.href;

        // get thumb
        var el = (params && params.thumbnailId) ? hs.$(params.thumbnailId) : a;
        el = this.thumb = el.getElementsByTagName('img')[0] || el;
        this.thumbsUserSetId = el.id || a.id;
        if (!hs.fireEvent(this, 'onInit')) return true;

        // check if already open
        for (var i = 0; i < hs.expanders.length; i++) {
            if (hs.expanders[i] && hs.expanders[i].a == a
			&& !(this.last && this.transitions[1] == 'crossfade')) {
                hs.expanders[i].focus();
                return false;
            }
        }

        // cancel other
        if (!hs.allowSimultaneousLoading) for (var i = 0; i < hs.expanders.length; i++) {
            if (hs.expanders[i] && hs.expanders[i].thumb != el && !hs.expanders[i].onLoadStarted) {
                hs.expanders[i].cancelLoading();
            }
        }
        hs.expanders[key] = this;
        if (!hs.allowMultipleInstances && !hs.upcoming) {
            if (hs.expanders[key - 1]) hs.expanders[key - 1].close();
            if (typeof hs.focusKey != 'undefined' && hs.expanders[hs.focusKey])
                hs.expanders[hs.focusKey].close();
        }

        // initiate metrics
        this.el = el;
        this.tpos = this.pageOrigin || hs.getPosition(el);
        hs.getPageSize();
        var x = this.x = new hs.Dimension(this, 'x');
        x.calcThumb();
        var y = this.y = new hs.Dimension(this, 'y');
        y.calcThumb();
        if (/area/i.test(el.tagName)) this.getImageMapAreaCorrection(el);
        this.wrapper = hs.createElement(
		'div', {
		    id: 'highslide-wrapper-' + this.key,
		    className: 'highslide-wrapper ' + this.wrapperClassName
		}, {
		    visibility: 'hidden',
		    position: 'absolute',
		    zIndex: hs.zIndexCounter += 2
		}, null, true);

        this.wrapper.onmouseover = this.wrapper.onmouseout = hs.wrapperMouseHandler;
        if (this.contentType == 'image' && this.outlineWhileAnimating == 2)
            this.outlineWhileAnimating = 0;

        // get the outline
        if (!this.outlineType
		|| (this.last && this.isImage && this.transitions[1] == 'crossfade')) {
            this[this.contentType + 'Create']();

        } else if (hs.pendingOutlines[this.outlineType]) {
            this.connectOutline();
            this[this.contentType + 'Create']();

        } else {
            this.showLoading();
            var exp = this;
            new hs.Outline(this.outlineType,
			function() {
			    exp.connectOutline();
			    exp[exp.contentType + 'Create']();
			}
		);
        }
        return true;
    };

    hs.Expander.prototype = {
        error: function(e) {
            if (hs.debug) alert('Line ' + e.lineNumber + ': ' + e.message);
            else window.location.href = this.src;
        },

        connectOutline: function() {
            var outline = this.outline = hs.pendingOutlines[this.outlineType];
            outline.exp = this;
            outline.table.style.zIndex = this.wrapper.style.zIndex - 1;
            hs.pendingOutlines[this.outlineType] = null;
        },

        showLoading: function() {
            if (this.onLoadStarted || this.loading) return;

            this.loading = hs.loading;
            var exp = this;
            this.loading.onclick = function() {
                exp.cancelLoading();
            };


            if (!hs.fireEvent(this, 'onShowLoading')) return;
            var exp = this,
		l = this.x.get('loadingPos') + 'px',
		t = this.y.get('loadingPos') + 'px';
            if (!tgt && this.last && this.transitions[1] == 'crossfade')
                var tgt = this.last;
            if (tgt) {
                l = tgt.x.get('loadingPosXfade') + 'px';
                t = tgt.y.get('loadingPosXfade') + 'px';
                this.loading.style.zIndex = hs.zIndexCounter++;
            }
            setTimeout(function() {
                if (exp.loading) hs.setStyles(exp.loading, { left: l, top: t, zIndex: hs.zIndexCounter++ })
            }
	, 100);
        },

        imageCreate: function() {
            var exp = this;

            var img = document.createElement('img');
            this.content = img;
            img.onload = function() {
                if (hs.expanders[exp.key]) exp.contentLoaded();
            };
            if (hs.blockRightClick) img.oncontextmenu = function() { return false; };
            img.className = 'highslide-image';
            hs.setStyles(img, {
                visibility: 'hidden',
                display: 'block',
                position: 'absolute',
                maxWidth: '9999px',
                zIndex: 3
            });
            img.title = hs.lang.restoreTitle;
            if (hs.safari && hs.uaVersion < 525) hs.container.appendChild(img);
            if (hs.ie && hs.flushImgSize) img.src = null;
            img.src = this.src;

            this.showLoading();
        },

        htmlCreate: function() {
            if (!hs.fireEvent(this, 'onBeforeGetContent')) return;

            this.content = hs.getCacheBinding(this.a);
            if (!this.content)
                this.content = hs.getNode(this.contentId);
            if (!this.content)
                this.content = hs.getSelfRendered();
            this.getInline(['maincontent']);
            if (this.maincontent) {
                var body = hs.getElementByClass(this.content, 'div', 'highslide-body');
                if (body) body.appendChild(this.maincontent);
                this.maincontent.style.display = 'block';
            }
            hs.fireEvent(this, 'onAfterGetContent');

            var innerContent = this.innerContent = this.content;

            if (/(swf|iframe)/.test(this.objectType)) this.setObjContainerSize(innerContent);

            // the content tree
            hs.container.appendChild(this.wrapper);
            hs.setStyles(this.wrapper, {
                position: 'static',
                padding: '0 ' + hs.marginRight + 'px 0 ' + hs.marginLeft + 'px'
            });
            this.content = hs.createElement(
    	'div', {
    	    className: 'highslide-html'
    	}, {
    	    position: 'relative',
    	    zIndex: 3,
    	    height: 0,
    	    overflow: 'hidden'
    	},
		this.wrapper
	);
            this.mediumContent = hs.createElement('div', null, null, this.content, 1);
            this.mediumContent.appendChild(innerContent);

            hs.setStyles(innerContent, {
                position: 'relative',
                display: 'block',
                direction: hs.lang.cssDirection || ''
            });
            if (this.width) innerContent.style.width = this.width + 'px';
            if (this.height) hs.setStyles(innerContent, {
                height: this.height + 'px',
                overflow: 'hidden'
            });
            if (innerContent.offsetWidth < this.minWidth)
                innerContent.style.width = this.minWidth + 'px';



            if (this.objectType == 'ajax' && !hs.getCacheBinding(this.a)) {
                this.showLoading();
                var exp = this;
                var ajax = new hs.Ajax(this.a, innerContent);
                ajax.src = this.src;
                ajax.onLoad = function() { if (hs.expanders[exp.key]) exp.contentLoaded(); };
                ajax.onError = function() { location.href = exp.src; };
                ajax.run();
            }
            else

                if (this.objectType == 'iframe' && this.objectLoadTime == 'before') {
                this.writeExtendedContent();
            }
            else
                this.contentLoaded();
        },

        contentLoaded: function() {
            try {
                if (!this.content) return;
                this.content.onload = null;
                if (this.onLoadStarted) return;
                else this.onLoadStarted = true;

                var x = this.x, y = this.y;

                if (this.loading) {
                    hs.setStyles(this.loading, { top: '-9999px' });
                    this.loading = null;
                    hs.fireEvent(this, 'onHideLoading');
                }
                if (this.isImage) {
                    x.full = this.content.width;
                    y.full = this.content.height;

                    hs.setStyles(this.content, {
                        width: x.t + 'px',
                        height: y.t + 'px'
                    });
                    this.wrapper.appendChild(this.content);
                    hs.container.appendChild(this.wrapper);
                } else if (this.htmlGetSize) this.htmlGetSize();

                x.calcBorders();
                y.calcBorders();

                hs.setStyles(this.wrapper, {
                    left: (x.tpos + x.tb - x.cb) + 'px',
                    top: (y.tpos + x.tb - y.cb) + 'px'
                });


                this.initSlideshow();
                this.getOverlays();

                var ratio = x.full / y.full;
                x.calcExpanded();
                this.justify(x);

                y.calcExpanded();
                this.justify(y);
                if (this.isHtml) this.htmlSizeOperations();
                if (this.overlayBox) this.sizeOverlayBox(0, 1);


                if (this.allowSizeReduction) {
                    if (this.isImage)
                        this.correctRatio(ratio);
                    else this.fitOverlayBox();
                    var ss = this.slideshow;
                    if (ss && this.last && ss.controls && ss.fixedControls) {
                        var pos = ss.overlayOptions.position || '', p;
                        for (var dim in hs.oPos) for (var i = 0; i < 5; i++) {
                            p = this[dim];
                            if (pos.match(hs.oPos[dim][i])) {
                                p.pos = this.last[dim].pos
							+ (this.last[dim].p1 - p.p1)
							+ (this.last[dim].size - p.size) * [0, 0, .5, 1, 1][i];
                                if (ss.fixedControls == 'fit') {
                                    if (p.pos + p.size + p.p1 + p.p2 > p.scroll + p.clientSize - p.marginMax)
                                        p.pos = p.scroll + p.clientSize - p.size - p.marginMin - p.marginMax - p.p1 - p.p2;
                                    if (p.pos < p.scroll + p.marginMin) p.pos = p.scroll + p.marginMin;
                                }
                            }
                        }
                    }
                    if (this.isImage && this.x.full > (this.x.imgSize || this.x.size)) {
                        this.createFullExpand();
                        if (this.overlays.length == 1) this.sizeOverlayBox();
                    }
                }
                this.show();

            } catch (e) {
                this.error(e);
            }
        },


        setObjContainerSize: function(parent, auto) {
            var c = hs.getElementByClass(parent, 'DIV', 'highslide-body');
            if (/(iframe|swf)/.test(this.objectType)) {
                if (this.objectWidth) c.style.width = this.objectWidth + 'px';
                if (this.objectHeight) c.style.height = this.objectHeight + 'px';
            }
        },

        writeExtendedContent: function() {
            if (this.hasExtendedContent) return;
            var exp = this;
            this.body = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body');
            if (this.objectType == 'iframe') {
                this.showLoading();
                var ruler = hs.clearing.cloneNode(1);
                this.body.appendChild(ruler);
                this.newWidth = this.innerContent.offsetWidth;
                if (!this.objectWidth) this.objectWidth = ruler.offsetWidth;
                var hDiff = this.innerContent.offsetHeight - this.body.offsetHeight,
			h = this.objectHeight || hs.page.height - hDiff - hs.marginTop - hs.marginBottom,
			onload = this.objectLoadTime == 'before' ?
				' onload="if (hs.expanders[' + this.key + ']) hs.expanders[' + this.key + '].contentLoaded()" ' : '';
                this.body.innerHTML += '<iframe name="hs' + (new Date()).getTime() + '" frameborder="0" key="' + this.key + '" '
			+ ' style="width:' + this.objectWidth + 'px; height:' + h + 'px" '
			+ onload + ' src="' + this.src + '" ></iframe>';
                this.ruler = this.body.getElementsByTagName('div')[0];
                this.iframe = this.body.getElementsByTagName('iframe')[0];

                if (this.objectLoadTime == 'after') this.correctIframeSize();

            }
            if (this.objectType == 'swf') {
                this.body.id = this.body.id || 'hs-flash-id-' + this.key;
                var a = this.swfOptions;
                if (!a.params) a.params = {};
                if (typeof a.params.wmode == 'undefined') a.params.wmode = 'transparent';
                if (swfobject) swfobject.embedSWF(this.src, this.body.id, this.objectWidth, this.objectHeight,
			a.version || '7', a.expressInstallSwfurl, a.flashvars, a.params, a.attributes);
            }
            this.hasExtendedContent = true;
        },
        htmlGetSize: function() {
            if (this.iframe && !this.objectHeight) { // loadtime before
                this.iframe.style.height = this.body.style.height = this.getIframePageHeight() + 'px';
            }
            this.innerContent.appendChild(hs.clearing);
            if (!this.x.full) this.x.full = this.innerContent.offsetWidth;
            this.y.full = this.innerContent.offsetHeight;
            this.innerContent.removeChild(hs.clearing);
            if (hs.ie && this.newHeight > parseInt(this.innerContent.currentStyle.height)) { // ie css bug
                this.newHeight = parseInt(this.innerContent.currentStyle.height);
            }
            hs.setStyles(this.wrapper, { position: 'absolute', padding: '0' });
            hs.setStyles(this.content, { width: this.x.t + 'px', height: this.y.t + 'px' });

        },

        getIframePageHeight: function() {
            var h;
            try {
                var doc = this.iDoc = this.iframe.contentDocument || this.iframe.contentWindow.document;
                var clearing = doc.createElement('div');
                clearing.style.clear = 'both';
                doc.body.appendChild(clearing);
                h = clearing.offsetTop;
                if (hs.ie) h += parseInt(doc.body.currentStyle.marginTop)
			+ parseInt(doc.body.currentStyle.marginBottom) - 1;
            } catch (e) { // other domain
                h = 300;
            }
            return h;
        },
        correctIframeSize: function() {
            var wDiff = this.innerContent.offsetWidth - this.ruler.offsetWidth;
            hs.discardElement(this.ruler);
            if (wDiff < 0) wDiff = 0;

            var hDiff = this.innerContent.offsetHeight - this.iframe.offsetHeight;
            if (this.iDoc && !this.objectHeight && !this.height && this.y.size == this.y.full) try {
                this.iDoc.body.style.overflow = 'hidden';
            } catch (e) { }
            hs.setStyles(this.iframe, {
                width: Math.abs(this.x.size - wDiff) + 'px',
                height: Math.abs(this.y.size - hDiff) + 'px'
            });
            hs.setStyles(this.body, {
                width: this.iframe.style.width,
                height: this.iframe.style.height
            });

            this.scrollingContent = this.iframe;
            this.scrollerDiv = this.scrollingContent;

        },
        htmlSizeOperations: function() {

            this.setObjContainerSize(this.innerContent);


            if (this.objectType == 'swf' && this.objectLoadTime == 'before') this.writeExtendedContent();

            // handle minimum size
            if (this.x.size < this.x.full && !this.allowWidthReduction) this.x.size = this.x.full;
            if (this.y.size < this.y.full && !this.allowHeightReduction) this.y.size = this.y.full;
            this.scrollerDiv = this.innerContent;
            hs.setStyles(this.mediumContent, {
                position: 'relative',
                width: this.x.size + 'px'
            });
            hs.setStyles(this.innerContent, {
                border: 'none',
                width: 'auto',
                height: 'auto'
            });
            var node = hs.getElementByClass(this.innerContent, 'DIV', 'highslide-body');
            if (node && !/(iframe|swf)/.test(this.objectType)) {
                var cNode = node; // wrap to get true size
                node = hs.createElement(cNode.nodeName, null, { overflow: 'hidden' }, null, true);
                cNode.parentNode.insertBefore(node, cNode);
                node.appendChild(hs.clearing); // IE6
                node.appendChild(cNode);

                var wDiff = this.innerContent.offsetWidth - node.offsetWidth;
                var hDiff = this.innerContent.offsetHeight - node.offsetHeight;
                node.removeChild(hs.clearing);

                var kdeBugCorr = hs.safari || navigator.vendor == 'KDE' ? 1 : 0; // KDE repainting bug
                hs.setStyles(node, {
                    width: (this.x.size - wDiff - kdeBugCorr) + 'px',
                    height: (this.y.size - hDiff) + 'px',
                    overflow: 'auto',
                    position: 'relative'
                }
    	);
                if (kdeBugCorr && cNode.offsetHeight > node.offsetHeight) {
                    node.style.width = (parseInt(node.style.width) + kdeBugCorr) + 'px';
                }
                this.scrollingContent = node;
                this.scrollerDiv = this.scrollingContent;
            }
            if (this.iframe && this.objectLoadTime == 'before') this.correctIframeSize();
            if (!this.scrollingContent && this.y.size < this.mediumContent.offsetHeight) this.scrollerDiv = this.content;

            if (this.scrollerDiv == this.content && !this.allowWidthReduction && !/(iframe|swf)/.test(this.objectType)) {
                this.x.size += 17; // room for scrollbars
            }
            if (this.scrollerDiv && this.scrollerDiv.offsetHeight > this.scrollerDiv.parentNode.offsetHeight) {
                setTimeout("try { hs.expanders[" + this.key + "].scrollerDiv.style.overflow = 'auto'; } catch(e) {}",
			 hs.expandDuration);
            }
        },

        getImageMapAreaCorrection: function(area) {
            var c = area.coords.split(',');
            for (var i = 0; i < c.length; i++) c[i] = parseInt(c[i]);

            if (area.shape.toLowerCase() == 'circle') {
                this.x.tpos += c[0] - c[2];
                this.y.tpos += c[1] - c[2];
                this.x.t = this.y.t = 2 * c[2];
            } else {
                var maxX, maxY, minX = maxX = c[0], minY = maxY = c[1];
                for (var i = 0; i < c.length; i++) {
                    if (i % 2 == 0) {
                        minX = Math.min(minX, c[i]);
                        maxX = Math.max(maxX, c[i]);
                    } else {
                        minY = Math.min(minY, c[i]);
                        maxY = Math.max(maxY, c[i]);
                    }
                }
                this.x.tpos += minX;
                this.x.t = maxX - minX;
                this.y.tpos += minY;
                this.y.t = maxY - minY;
            }
        },
        justify: function(p, moveOnly) {
            var tgtArr, tgt = p.target, dim = p == this.x ? 'x' : 'y';

            if (tgt && tgt.match(/ /)) {
                tgtArr = tgt.split(' ');
                tgt = tgtArr[0];
            }
            if (tgt && hs.$(tgt)) {
                p.pos = hs.getPosition(hs.$(tgt))[dim];
                if (tgtArr && tgtArr[1] && tgtArr[1].match(/^[-]?[0-9]+px$/))
                    p.pos += parseInt(tgtArr[1]);
                if (p.size < p.minSize) p.size = p.minSize;

            } else if (p.justify == 'auto' || p.justify == 'center') {

                var hasMovedMin = false;

                var allowReduce = p.exp.allowSizeReduction;
                if (p.justify == 'center')
                    p.pos = Math.round(p.scroll + (p.clientSize + p.marginMin - p.marginMax - p.get('wsize')) / 2);
                else
                    p.pos = Math.round(p.pos - ((p.get('wsize') - p.t) / 2));
                if (p.pos < p.scroll + p.marginMin) {
                    p.pos = p.scroll + p.marginMin;
                    hasMovedMin = true;
                }
                if (!moveOnly && p.size < p.minSize) {
                    p.size = p.minSize;
                    allowReduce = false;
                }
                if (p.pos + p.get('wsize') > p.scroll + p.clientSize - p.marginMax) {
                    if (!moveOnly && hasMovedMin && allowReduce) {
                        p.size = Math.min(p.size, p.get(dim == 'y' ? 'fitsize' : 'maxsize'));
                    } else if (p.get('wsize') < p.get('fitsize')) {
                        p.pos = p.scroll + p.clientSize - p.marginMax - p.get('wsize');
                    } else { // image larger than viewport
                        p.pos = p.scroll + p.marginMin;
                        if (!moveOnly && allowReduce) p.size = p.get(dim == 'y' ? 'fitsize' : 'maxsize');
                    }
                }

                if (!moveOnly && p.size < p.minSize) {
                    p.size = p.minSize;
                    allowReduce = false;
                }


            } else if (p.justify == 'max') {
                p.pos = Math.floor(p.pos - p.size + p.t);
            }


            if (p.pos < p.marginMin) {
                var tmpMin = p.pos;
                p.pos = p.marginMin;

                if (allowReduce && !moveOnly) p.size = p.size - (p.pos - tmpMin);

            }
        },

        correctRatio: function(ratio) {
            var x = this.x,
		y = this.y,
		changed = false,
		xSize = Math.min(x.full, x.size),
		ySize = Math.min(y.full, y.size),
		useBox = (this.useBox || hs.padToMinWidth);

            if (xSize / ySize > ratio) { // width greater
                xSize = ySize * ratio;
                if (xSize < x.minSize) { // below minWidth
                    xSize = x.minSize;
                    ySize = xSize / ratio;
                }
                changed = true;

            } else if (xSize / ySize < ratio) { // height greater
                ySize = xSize / ratio;
                changed = true;
            }

            if (hs.padToMinWidth && x.full < x.minSize) {
                x.imgSize = x.full;
                y.size = y.imgSize = y.full;
            } else if (this.useBox) {
                x.imgSize = xSize;
                y.imgSize = ySize;
            } else {
                x.size = xSize;
                y.size = ySize;
            }
            changed = this.fitOverlayBox(this.useBox ? null : ratio, changed);
            if (useBox && y.size < y.imgSize) {
                y.imgSize = y.size;
                x.imgSize = y.size * ratio;
            }
            if (changed || useBox) {
                x.pos = x.tpos - x.cb + x.tb;
                x.minSize = x.size;
                this.justify(x, true);

                y.pos = y.tpos - y.cb + y.tb;
                y.minSize = y.size;
                this.justify(y, true);
                if (this.overlayBox) this.sizeOverlayBox();
            }


        },
        fitOverlayBox: function(ratio, changed) {
            var x = this.x, y = this.y;
            if (this.overlayBox && (this.isImage || this.allowHeightReduction)) {
                while (y.size > this.minHeight && x.size > this.minWidth
				&& y.get('wsize') > y.get('fitsize')) {
                    y.size -= 10;
                    if (ratio) x.size = y.size * ratio;
                    this.sizeOverlayBox(0, 1);
                    changed = true;
                }
            }
            return changed;
        },

        reflow: function() {
            if (this.scrollerDiv) {
                var h = /iframe/i.test(this.scrollerDiv.tagName) ? (this.getIframePageHeight() + 1) + 'px' : 'auto';
                if (this.body) this.body.style.height = h;
                this.scrollerDiv.style.height = h;
                this.y.setSize(this.innerContent.offsetHeight);
            }
        },

        show: function() {
            var x = this.x, y = this.y;
            this.doShowHide('hidden');
            hs.fireEvent(this, 'onBeforeExpand');
            if (this.slideshow && this.slideshow.thumbstrip) this.slideshow.thumbstrip.selectThumb();

            // Apply size change
            this.changeSize(
		1, {
		    wrapper: {
		        width: x.get('wsize'),
		        height: y.get('wsize'),
		        left: x.pos,
		        top: y.pos
		    },
		    content: {
		        left: x.p1 + x.get('imgPad'),
		        top: y.p1 + y.get('imgPad'),
		        width: x.imgSize || x.size,
		        height: y.imgSize || y.size
		    }
		},
		hs.expandDuration
	);
        },

        changeSize: function(up, to, dur) {
            // transition
            var trans = this.transitions,
	other = up ? (this.last ? this.last.a : null) : hs.upcoming,
	t = (trans[1] && other
			&& hs.getParam(other, 'transitions')[1] == trans[1]) ?
		trans[1] : trans[0];

            if (this[t] && t != 'expand') {
                this[t](up, to);
                return;
            }

            if (this.outline && !this.outlineWhileAnimating) {
                if (up) this.outline.setPosition();
                else this.outline.destroy(
				(this.isHtml && this.preserveContent));
            }


            if (!up) this.destroyOverlays();

            var exp = this,
		x = exp.x,
		y = exp.y,
		easing = this.easing;
            if (!up) easing = this.easingClose || easing;
            var after = up ?
		function() {

		    if (exp.outline) exp.outline.table.style.visibility = "visible";
		    setTimeout(function() {
		        exp.afterExpand();
		    }, 50);
		} :
		function() {
		    exp.afterClose();
		};
            if (up) hs.setStyles(this.wrapper, {
                width: x.t + 'px',
                height: y.t + 'px'
            });
            if (up && this.isHtml) {
                hs.setStyles(this.wrapper, {
                    left: (x.tpos - x.cb + x.tb) + 'px',
                    top: (y.tpos - y.cb + y.tb) + 'px'
                });
            }
            if (this.fadeInOut) {
                hs.setStyles(this.wrapper, { opacity: up ? 0 : 1 });
                hs.extend(to.wrapper, { opacity: up });
            }
            hs.animate(this.wrapper, to.wrapper, {
                duration: dur,
                easing: easing,
                step: function(val, args) {
                    if (exp.outline && exp.outlineWhileAnimating && args.prop == 'top') {
                        var fac = up ? args.pos : 1 - args.pos;
                        var pos = {
                            w: x.t + (x.get('wsize') - x.t) * fac,
                            h: y.t + (y.get('wsize') - y.t) * fac,
                            x: x.tpos + (x.pos - x.tpos) * fac,
                            y: y.tpos + (y.pos - y.tpos) * fac
                        };
                        exp.outline.setPosition(pos, 0, 1);
                    }
                    if (exp.isHtml) {
                        if (args.prop == 'left')
                            exp.mediumContent.style.left = (x.pos - val) + 'px';
                        if (args.prop == 'top')
                            exp.mediumContent.style.top = (y.pos - val) + 'px';
                    }
                }
            });
            hs.animate(this.content, to.content, dur, easing, after);
            if (up) {
                this.wrapper.style.visibility = 'visible';
                this.content.style.visibility = 'visible';
                if (this.isHtml) this.innerContent.style.visibility = 'visible';
                this.a.className += ' highslide-active-anchor';
            }
        },



        fade: function(up, to) {
            this.outlineWhileAnimating = false;
            var exp = this, t = up ? hs.expandDuration : 0;

            if (up) {
                hs.animate(this.wrapper, to.wrapper, 0);
                hs.setStyles(this.wrapper, { opacity: 0, visibility: 'visible' });
                hs.animate(this.content, to.content, 0);
                this.content.style.visibility = 'visible';

                hs.animate(this.wrapper, { opacity: 1 }, t, null,
			function() { exp.afterExpand(); });
            }

            if (this.outline) {
                this.outline.table.style.zIndex = this.wrapper.style.zIndex;
                var dir = up || -1,
			offset = this.outline.offset,
			startOff = up ? 3 : offset,
			endOff = up ? offset : 3;
                for (var i = startOff; dir * i <= dir * endOff; i += dir, t += 25) {
                    (function() {
                        var o = up ? endOff - i : startOff - i;
                        setTimeout(function() {
                            exp.outline.setPosition(0, o, 1);
                        }, t);
                    })();
                }
            }


            if (up) { } //setTimeout(function() { exp.afterExpand(); }, t+50);
            else {
                setTimeout(function() {
                    if (exp.outline) exp.outline.destroy(exp.preserveContent);

                    exp.destroyOverlays();

                    hs.animate(exp.wrapper, { opacity: 0 }, hs.restoreDuration, null, function() {
                        exp.afterClose();
                    });
                }, t);
            }
        },
        crossfade: function(up, to, from) {
            if (!up) return;
            var exp = this,
		last = this.last,
		x = this.x,
		y = this.y,
		lastX = last.x,
		lastY = last.y,
		wrapper = this.wrapper,
		content = this.content,
		overlayBox = this.overlayBox;
            hs.removeEventListener(document, 'mousemove', hs.dragHandler);

            hs.setStyles(content, {
                width: (x.imgSize || x.size) + 'px',
                height: (y.imgSize || y.size) + 'px'
            });
            if (overlayBox) overlayBox.style.overflow = 'visible';
            this.outline = last.outline;
            if (this.outline) this.outline.exp = exp;
            last.outline = null;
            var fadeBox = hs.createElement('div', {
                className: 'highslide-' + this.contentType
            }, {
                position: 'absolute',
                zIndex: 4,
                overflow: 'hidden',
                display: 'none'
            }
	);
            var names = { oldImg: last, newImg: this };
            for (var n in names) {
                this[n] = names[n].content.cloneNode(1);
                hs.setStyles(this[n], {
                    position: 'absolute',
                    border: 0,
                    visibility: 'visible'
                });
                fadeBox.appendChild(this[n]);
            }
            wrapper.appendChild(fadeBox);
            if (this.isHtml) hs.setStyles(this.mediumContent, {
                left: 0,
                top: 0
            });
            if (overlayBox) {
                overlayBox.className = '';
                wrapper.appendChild(overlayBox);
            }
            fadeBox.style.display = '';
            last.content.style.display = 'none';


            if (hs.safari && hs.uaVersion < 525) {
                this.wrapper.style.visibility = 'visible';
            }
            hs.animate(wrapper, {
                width: x.size
            }, {
                duration: hs.transitionDuration,
                step: function(val, args) {
                    var pos = args.pos,
				invPos = 1 - pos;
                    var prop,
				size = {},
				props = ['pos', 'size', 'p1', 'p2'];
                    for (var n in props) {
                        prop = props[n];
                        size['x' + prop] = Math.round(invPos * lastX[prop] + pos * x[prop]);
                        size['y' + prop] = Math.round(invPos * lastY[prop] + pos * y[prop]);
                        size.ximgSize = Math.round(
					invPos * (lastX.imgSize || lastX.size) + pos * (x.imgSize || x.size));
                        size.ximgPad = Math.round(invPos * lastX.get('imgPad') + pos * x.get('imgPad'));
                        size.yimgSize = Math.round(
					invPos * (lastY.imgSize || lastY.size) + pos * (y.imgSize || y.size));
                        size.yimgPad = Math.round(invPos * lastY.get('imgPad') + pos * y.get('imgPad'));
                    }
                    if (exp.outline) exp.outline.setPosition({
                        x: size.xpos,
                        y: size.ypos,
                        w: size.xsize + size.xp1 + size.xp2 + 2 * x.cb,
                        h: size.ysize + size.yp1 + size.yp2 + 2 * y.cb
                    });
                    last.wrapper.style.clip = 'rect('
				+ (size.ypos - lastY.pos) + 'px, '
				+ (size.xsize + size.xp1 + size.xp2 + size.xpos + 2 * lastX.cb - lastX.pos) + 'px, '
				+ (size.ysize + size.yp1 + size.yp2 + size.ypos + 2 * lastY.cb - lastY.pos) + 'px, '
				+ (size.xpos - lastX.pos) + 'px)';

                    hs.setStyles(content, {
                        top: (size.yp1 + y.get('imgPad')) + 'px',
                        left: (size.xp1 + x.get('imgPad')) + 'px',
                        marginTop: (y.pos - size.ypos) + 'px',
                        marginLeft: (x.pos - size.xpos) + 'px'
                    });
                    hs.setStyles(wrapper, {
                        top: size.ypos + 'px',
                        left: size.xpos + 'px',
                        width: (size.xp1 + size.xp2 + size.xsize + 2 * x.cb) + 'px',
                        height: (size.yp1 + size.yp2 + size.ysize + 2 * y.cb) + 'px'
                    });
                    hs.setStyles(fadeBox, {
                        width: (size.ximgSize || size.xsize) + 'px',
                        height: (size.yimgSize || size.ysize) + 'px',
                        left: (size.xp1 + size.ximgPad) + 'px',
                        top: (size.yp1 + size.yimgPad) + 'px',
                        visibility: 'visible'
                    });

                    hs.setStyles(exp.oldImg, {
                        top: (lastY.pos - size.ypos + lastY.p1 - size.yp1 + lastY.get('imgPad') - size.yimgPad) + 'px',
                        left: (lastX.pos - size.xpos + lastX.p1 - size.xp1 + lastX.get('imgPad') - size.ximgPad) + 'px'
                    });

                    hs.setStyles(exp.newImg, {
                        opacity: pos,
                        top: (y.pos - size.ypos + y.p1 - size.yp1 + y.get('imgPad') - size.yimgPad) + 'px',
                        left: (x.pos - size.xpos + x.p1 - size.xp1 + x.get('imgPad') - size.ximgPad) + 'px'
                    });
                    if (overlayBox) hs.setStyles(overlayBox, {
                        width: size.xsize + 'px',
                        height: size.ysize + 'px',
                        left: (size.xp1 + x.cb) + 'px',
                        top: (size.yp1 + y.cb) + 'px'
                    });
                },
                complete: function() {
                    wrapper.style.visibility = content.style.visibility = 'visible';
                    content.style.display = 'block';
                    hs.discardElement(fadeBox);
                    exp.afterExpand();
                    last.afterClose();
                    exp.last = null;
                }

            });
        },
        reuseOverlay: function(o, el) {
            if (!this.last) return false;
            for (var i = 0; i < this.last.overlays.length; i++) {
                var oDiv = hs.$('hsId' + this.last.overlays[i]);
                if (oDiv && oDiv.hsId == o.hsId) {
                    this.genOverlayBox();
                    oDiv.reuse = this.key;
                    hs.push(this.overlays, this.last.overlays[i]);
                    return true;
                }
            }
            return false;
        },


        afterExpand: function() {
            this.isExpanded = true;
            this.focus();

            if (this.isHtml && this.objectLoadTime == 'after') this.writeExtendedContent();
            if (this.iframe) {
                try {
                    var exp = this,
				doc = this.iframe.contentDocument || this.iframe.contentWindow.document;
                    hs.addEventListener(doc, 'mousedown', function() {
                        if (hs.focusKey != exp.key) exp.focus();
                    });
                } catch (e) { }
                if (hs.ie && typeof this.isClosing != 'boolean') // first open 
                    this.iframe.style.width = (this.objectWidth - 1) + 'px'; // hasLayout
            }
            if (this.dimmingOpacity) hs.dim(this);
            if (hs.upcoming && hs.upcoming == this.a) hs.upcoming = null;
            this.prepareNextOutline();
            var p = hs.page, mX = hs.mouse.x + p.scrollLeft, mY = hs.mouse.y + p.scrollTop;
            this.mouseIsOver = this.x.pos < mX && mX < this.x.pos + this.x.get('wsize')
		&& this.y.pos < mY && mY < this.y.pos + this.y.get('wsize');
            if (this.overlayBox) this.showOverlays();
            hs.fireEvent(this, 'onAfterExpand');

        },


        prepareNextOutline: function() {
            var key = this.key;
            var outlineType = this.outlineType;
            new hs.Outline(outlineType,
		function() { try { hs.expanders[key].preloadNext(); } catch (e) { } });
        },


        preloadNext: function() {
            var next = this.getAdjacentAnchor(1);
            if (next && next.onclick.toString().match(/hs\.expand/))
                var img = hs.createElement('img', { src: hs.getSrc(next) });
        },


        getAdjacentAnchor: function(op) {
            var current = this.getAnchorIndex(), as = hs.anchors.groups[this.slideshowGroup || 'none'];
            if (as && !as[current + op] && this.slideshow && this.slideshow.repeat) {
                if (op == 1) return as[0];
                else if (op == -1) return as[as.length - 1];
            }
            return (as && as[current + op]) || null;
        },

        getAnchorIndex: function() {
            var arr = hs.getAnchors().groups[this.slideshowGroup || 'none'];
            if (arr) for (var i = 0; i < arr.length; i++) {
                if (arr[i] == this.a) return i;
            }
            return null;
        },


        getNumber: function() {
            if (this[this.numberPosition]) {
                var arr = hs.anchors.groups[this.slideshowGroup || 'none'];
                if (arr) {
                    var s = hs.lang.number.replace('%1', this.getAnchorIndex() + 1).replace('%2', arr.length);
                    this[this.numberPosition].innerHTML =
				'<div class="highslide-number">' + s + '</div>' + this[this.numberPosition].innerHTML;
                }
            }
        },
        initSlideshow: function() {
            if (!this.last) {
                for (var i = 0; i < hs.slideshows.length; i++) {
                    var ss = hs.slideshows[i], sg = ss.slideshowGroup;
                    if (typeof sg == 'undefined' || sg === null || sg === this.slideshowGroup)
                        this.slideshow = new hs.Slideshow(this.key, ss);
                }
            } else {
                this.slideshow = this.last.slideshow;
            }
            var ss = this.slideshow;
            if (!ss) return;
            var key = ss.expKey = this.key;

            ss.checkFirstAndLast();
            ss.disable('full-expand');
            if (ss.controls) {
                this.createOverlay(hs.extend(ss.overlayOptions || {}, {
                    overlayId: ss.controls,
                    hsId: 'controls',
                    zIndex: 5
                }));
            }
            if (ss.thumbstrip) ss.thumbstrip.add(this);
            if (!this.last && this.autoplay) ss.play(true);
            if (ss.autoplay) {
                ss.autoplay = setTimeout(function() {
                    hs.next(key);
                }, (ss.interval || 500));
            }
        },

        cancelLoading: function() {
            hs.discardElement(this.wrapper);
            hs.expanders[this.key] = null;
            if (hs.upcoming == this.a) hs.upcoming = null;
            hs.undim(this.key);
            if (this.loading) hs.loading.style.left = '-9999px';
            hs.fireEvent(this, 'onHideLoading');
        },

        writeCredits: function() {
            if (this.credits) return;
            this.credits = hs.createElement('a', {
                href: hs.creditsHref,
                target: hs.creditsTarget,
                className: 'highslide-credits',
                innerHTML: hs.lang.creditsText,
                title: hs.lang.creditsTitle
            });
            this.createOverlay({
                overlayId: this.credits,
                position: this.creditsPosition || 'top left',
                hsId: 'credits'
            });
        },

        getInline: function(types, addOverlay) {
            for (var i = 0; i < types.length; i++) {
                var type = types[i], s = null;
                if (type == 'caption' && !hs.fireEvent(this, 'onBeforeGetCaption')) return;
                else if (type == 'heading' && !hs.fireEvent(this, 'onBeforeGetHeading')) return;
                if (!this[type + 'Id'] && this.thumbsUserSetId)
                    this[type + 'Id'] = type + '-for-' + this.thumbsUserSetId;
                if (this[type + 'Id']) this[type] = hs.getNode(this[type + 'Id']);
                if (!this[type] && !this[type + 'Text'] && this[type + 'Eval']) try {
                    s = eval(this[type + 'Eval']);
                } catch (e) { }
                if (!this[type] && this[type + 'Text']) {
                    s = this[type + 'Text'];
                }
                if (!this[type] && !s) {
                    this[type] = hs.getNode(this.a['_' + type + 'Id']);
                    if (!this[type]) {
                        var next = this.a.nextSibling;
                        while (next && !hs.isHsAnchor(next)) {
                            if ((new RegExp('highslide-' + type)).test(next.className || null)) {
                                if (!next.id) this.a['_' + type + 'Id'] = next.id = 'hsId' + hs.idCounter++;
                                this[type] = hs.getNode(next.id);
                                break;
                            }
                            next = next.nextSibling;
                        }
                    }
                }
                if (!this[type] && !s && this.numberPosition == type) s = '\n';

                if (!this[type] && s) this[type] = hs.createElement('div',
				{ className: 'highslide-' + type, innerHTML: s });

                if (addOverlay && this[type]) {
                    var o = { position: (type == 'heading') ? 'above' : 'below' };
                    for (var x in this[type + 'Overlay']) o[x] = this[type + 'Overlay'][x];
                    o.overlayId = this[type];
                    this.createOverlay(o);
                }
            }
        },


        // on end move and resize
        doShowHide: function(visibility) {
            if (hs.hideSelects) this.showHideElements('SELECT', visibility);
            if (hs.hideIframes) this.showHideElements('IFRAME', visibility);
            if (hs.geckoMac) this.showHideElements('*', visibility);
        },
        showHideElements: function(tagName, visibility) {
            var els = document.getElementsByTagName(tagName);
            var prop = tagName == '*' ? 'overflow' : 'visibility';
            for (var i = 0; i < els.length; i++) {
                if (prop == 'visibility' || (document.defaultView.getComputedStyle(
				els[i], "").getPropertyValue('overflow') == 'auto'
				|| els[i].getAttribute('hidden-by') != null)) {
                    var hiddenBy = els[i].getAttribute('hidden-by');
                    if (visibility == 'visible' && hiddenBy) {
                        hiddenBy = hiddenBy.replace('[' + this.key + ']', '');
                        els[i].setAttribute('hidden-by', hiddenBy);
                        if (!hiddenBy) els[i].style[prop] = els[i].origProp;
                    } else if (visibility == 'hidden') { // hide if behind
                        var elPos = hs.getPosition(els[i]);
                        elPos.w = els[i].offsetWidth;
                        elPos.h = els[i].offsetHeight;
                        if (!this.dimmingOpacity) { // hide all if dimming

                            var clearsX = (elPos.x + elPos.w < this.x.get('opos')
						|| elPos.x > this.x.get('opos') + this.x.get('osize'));
                            var clearsY = (elPos.y + elPos.h < this.y.get('opos')
						|| elPos.y > this.y.get('opos') + this.y.get('osize'));
                        }
                        var wrapperKey = hs.getWrapperKey(els[i]);
                        if (!clearsX && !clearsY && wrapperKey != this.key) { // element falls behind image
                            if (!hiddenBy) {
                                els[i].setAttribute('hidden-by', '[' + this.key + ']');
                                els[i].origProp = els[i].style[prop];
                                els[i].style[prop] = 'hidden';

                            } else if (hiddenBy.indexOf('[' + this.key + ']') == -1) {
                                els[i].setAttribute('hidden-by', hiddenBy + '[' + this.key + ']');
                            }
                        } else if ((hiddenBy == '[' + this.key + ']' || hs.focusKey == wrapperKey)
						&& wrapperKey != this.key) { // on move
                            els[i].setAttribute('hidden-by', '');
                            els[i].style[prop] = els[i].origProp || '';
                        } else if (hiddenBy && hiddenBy.indexOf('[' + this.key + ']') > -1) {
                            els[i].setAttribute('hidden-by', hiddenBy.replace('[' + this.key + ']', ''));
                        }

                    }
                }
            }
        },

        focus: function() {
            this.wrapper.style.zIndex = hs.zIndexCounter += 2;
            // blur others
            for (var i = 0; i < hs.expanders.length; i++) {
                if (hs.expanders[i] && i == hs.focusKey) {
                    var blurExp = hs.expanders[i];
                    blurExp.content.className += ' highslide-' + blurExp.contentType + '-blur';
                    if (blurExp.isImage) {
                        blurExp.content.style.cursor = hs.ie ? 'hand' : 'pointer';
                        blurExp.content.title = hs.lang.focusTitle;
                    }
                    hs.fireEvent(blurExp, 'onBlur');
                }
            }

            // focus this
            if (this.outline) this.outline.table.style.zIndex
		= this.wrapper.style.zIndex - 1;
            this.content.className = 'highslide-' + this.contentType;
            if (this.isImage) {
                this.content.title = hs.lang.restoreTitle;

                if (hs.restoreCursor) {
                    hs.styleRestoreCursor = window.opera ? 'pointer' : 'url(' + hs.graphicsDir + hs.restoreCursor + '), pointer';
                    if (hs.ie && hs.uaVersion < 6) hs.styleRestoreCursor = 'hand';
                    this.content.style.cursor = hs.styleRestoreCursor;
                }
            }
            hs.focusKey = this.key;
            hs.addEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);
            hs.fireEvent(this, 'onFocus');
        },
        moveTo: function(x, y) {
            this.x.setPos(x);
            this.y.setPos(y);
        },
        resize: function(e) {
            var w, h, r = e.width / e.height;
            w = Math.max(e.width + e.dX, Math.min(this.minWidth, this.x.full));
            if (this.isImage && Math.abs(w - this.x.full) < 12) w = this.x.full;
            h = this.isHtml ? e.height + e.dY : w / r;
            if (h < Math.min(this.minHeight, this.y.full)) {
                h = Math.min(this.minHeight, this.y.full);
                if (this.isImage) w = h * r;
            }
            this.resizeTo(w, h);
        },
        resizeTo: function(w, h) {
            this.y.setSize(h);
            this.x.setSize(w);
            this.wrapper.style.height = this.y.get('wsize') + 'px';
        },

        close: function() {
            if (this.isClosing || !this.isExpanded) return;
            if (this.transitions[1] == 'crossfade' && hs.upcoming) {
                hs.getExpander(hs.upcoming).cancelLoading();
                hs.upcoming = null;
            }
            if (!hs.fireEvent(this, 'onBeforeClose')) return;
            this.isClosing = true;
            if (this.slideshow && !hs.upcoming) this.slideshow.pause();

            hs.removeEventListener(document, window.opera ? 'keypress' : 'keydown', hs.keyHandler);

            try {
                if (this.isHtml) this.htmlPrepareClose();
                this.content.style.cursor = 'default';
                this.changeSize(
			0, {
			    wrapper: {
			        width: this.x.t,
			        height: this.y.t,
			        left: this.x.tpos - this.x.cb + this.x.tb,
			        top: this.y.tpos - this.y.cb + this.y.tb
			    },
			    content: {
			        left: 0,
			        top: 0,
			        width: this.x.t,
			        height: this.y.t
			    }
			}, hs.restoreDuration
		);
            } catch (e) { this.afterClose(); }
        },

        htmlPrepareClose: function() {
            if (hs.geckoMac) { // bad redraws
                if (!hs.mask) hs.mask = hs.createElement('div', null,
			{ position: 'absolute' }, hs.container);
                hs.setStyles(hs.mask, { width: this.x.size + 'px', height: this.y.size + 'px',
                    left: this.x.pos + 'px', top: this.y.pos + 'px', display: 'block'
                });
            }
            if (this.objectType == 'swf') try { hs.$(this.body.id).StopPlay(); } catch (e) { }

            if (this.objectLoadTime == 'after' && !this.preserveContent) this.destroyObject();
            if (this.scrollerDiv && this.scrollerDiv != this.scrollingContent)
                this.scrollerDiv.style.overflow = 'hidden';
        },

        destroyObject: function() {
            if (hs.ie && this.iframe)
                try { this.iframe.contentWindow.document.body.innerHTML = ''; } catch (e) { }
            if (this.objectType == 'swf') swfobject.removeSWF(this.body.id);
            this.body.innerHTML = '';
        },

        sleep: function() {
            if (this.outline) this.outline.table.style.display = 'none';
            this.releaseMask = null;
            this.wrapper.style.display = 'none';
            this.isExpanded = false;
            hs.push(hs.sleeping, this);
        },

        awake: function() {
            try {

                hs.expanders[this.key] = this;

                if (!hs.allowMultipleInstances && hs.focusKey != this.key) {
                    try { hs.expanders[hs.focusKey].close(); } catch (e) { }
                }

                var z = hs.zIndexCounter++, stl = { display: '', zIndex: z };
                hs.setStyles(this.wrapper, stl);
                this.isClosing = false;

                var o = this.outline || 0;
                if (o) {
                    if (!this.outlineWhileAnimating) stl.visibility = 'hidden';
                    hs.setStyles(o.table, stl);
                }
                if (this.slideshow) {
                    this.initSlideshow();
                }

                this.show();
            } catch (e) { }


        },

        createOverlay: function(o) {
            var el = o.overlayId,
		relToVP = (o.relativeTo == 'viewport' && !/panel$/.test(o.position));
            if (typeof el == 'string') el = hs.getNode(el);
            if (o.html) el = hs.createElement('div', { innerHTML: o.html });
            if (!el || typeof el == 'string') return;
            if (!hs.fireEvent(this, 'onCreateOverlay', { overlay: el })) return;
            el.style.display = 'block';
            o.hsId = o.hsId || o.overlayId;
            if (this.transitions[1] == 'crossfade' && this.reuseOverlay(o, el)) return;
            this.genOverlayBox();
            var width = o.width && /^[0-9]+(px|%)$/.test(o.width) ? o.width : 'auto';
            if (/^(left|right)panel$/.test(o.position) && !/^[0-9]+px$/.test(o.width)) width = '200px';
            var overlay = hs.createElement(
		'div', {
		    id: 'hsId' + hs.idCounter++,
		    hsId: o.hsId
		}, {
		    position: 'absolute',
		    visibility: 'hidden',
		    width: width,
		    direction: hs.lang.cssDirection || '',
		    opacity: 0
		},
		relToVP ? hs.viewport : this.overlayBox,
		true
	);
            if (relToVP) overlay.hsKey = this.key;

            overlay.appendChild(el);
            hs.extend(overlay, {
                opacity: 1,
                offsetX: 0,
                offsetY: 0,
                dur: (o.fade === 0 || o.fade === false || (o.fade == 2 && hs.ie)) ? 0 : 250
            });
            hs.extend(overlay, o);


            if (this.gotOverlays) {
                this.positionOverlay(overlay);
                if (!overlay.hideOnMouseOut || this.mouseIsOver)
                    hs.animate(overlay, { opacity: overlay.opacity }, overlay.dur);
            }
            hs.push(this.overlays, hs.idCounter - 1);
        },
        positionOverlay: function(overlay) {
            var p = overlay.position || 'middle center',
		relToVP = (overlay.relativeTo == 'viewport'),
		offX = overlay.offsetX,
		offY = overlay.offsetY;
            if (relToVP) {
                hs.viewport.style.display = 'block';
                overlay.hsKey = this.key;
                if (overlay.offsetWidth > overlay.parentNode.offsetWidth)
                    overlay.style.width = '100%';
            } else
                if (overlay.parentNode != this.overlayBox) this.overlayBox.appendChild(overlay);
            if (/left$/.test(p)) overlay.style.left = offX + 'px';

            if (/center$/.test(p)) hs.setStyles(overlay, {
                left: '50%',
                marginLeft: (offX - Math.round(overlay.offsetWidth / 2)) + 'px'
            });

            if (/right$/.test(p)) overlay.style.right = -offX + 'px';

            if (/^leftpanel$/.test(p)) {
                hs.setStyles(overlay, {
                    right: '100%',
                    marginRight: this.x.cb + 'px',
                    top: -this.y.cb + 'px',
                    bottom: -this.y.cb + 'px',
                    overflow: 'auto'
                });
                this.x.p1 = overlay.offsetWidth;

            } else if (/^rightpanel$/.test(p)) {
                hs.setStyles(overlay, {
                    left: '100%',
                    marginLeft: this.x.cb + 'px',
                    top: -this.y.cb + 'px',
                    bottom: -this.y.cb + 'px',
                    overflow: 'auto'
                });
                this.x.p2 = overlay.offsetWidth;
            }
            var parOff = overlay.parentNode.offsetHeight;
            overlay.style.height = 'auto';
            if (relToVP && overlay.offsetHeight > parOff)
                overlay.style.height = hs.ieLt7 ? parOff + 'px' : '100%';

            if (/^top/.test(p)) overlay.style.top = offY + 'px';
            if (/^middle/.test(p)) hs.setStyles(overlay, {
                top: '50%',
                marginTop: (offY - Math.round(overlay.offsetHeight / 2)) + 'px'
            });
            if (/^bottom/.test(p)) overlay.style.bottom = -offY + 'px';
            if (/^above$/.test(p)) {
                hs.setStyles(overlay, {
                    left: (-this.x.p1 - this.x.cb) + 'px',
                    right: (-this.x.p2 - this.x.cb) + 'px',
                    bottom: '100%',
                    marginBottom: this.y.cb + 'px',
                    width: 'auto'
                });
                this.y.p1 = overlay.offsetHeight;

            } else if (/^below$/.test(p)) {
                hs.setStyles(overlay, {
                    position: 'relative',
                    left: (-this.x.p1 - this.x.cb) + 'px',
                    right: (-this.x.p2 - this.x.cb) + 'px',
                    top: '100%',
                    marginTop: this.y.cb + 'px',
                    width: 'auto'
                });
                this.y.p2 = overlay.offsetHeight;
                overlay.style.position = 'absolute';
            }
        },

        getOverlays: function() {
            this.getInline(['heading', 'caption'], true);
            this.getNumber();
            if (this.caption) hs.fireEvent(this, 'onAfterGetCaption');
            if (this.heading) hs.fireEvent(this, 'onAfterGetHeading');
            if (this.heading && this.dragByHeading) this.heading.className += ' highslide-move';
            if (hs.showCredits) this.writeCredits();
            for (var i = 0; i < hs.overlays.length; i++) {
                var o = hs.overlays[i], tId = o.thumbnailId, sg = o.slideshowGroup;
                if ((!tId && !sg) || (tId && tId == this.thumbsUserSetId)
				|| (sg && sg === this.slideshowGroup)) {
                    if (this.isImage || (this.isHtml && o.useOnHtml))
                        this.createOverlay(o);
                }
            }
            var os = [];
            for (var i = 0; i < this.overlays.length; i++) {
                var o = hs.$('hsId' + this.overlays[i]);
                if (/panel$/.test(o.position)) this.positionOverlay(o);
                else hs.push(os, o);
            }
            for (var i = 0; i < os.length; i++) this.positionOverlay(os[i]);
            this.gotOverlays = true;
        },
        genOverlayBox: function() {
            if (!this.overlayBox) this.overlayBox = hs.createElement(
		'div', {
		    className: this.wrapperClassName
		}, {
		    position: 'absolute',
		    width: (this.x.size || (this.useBox ? this.width : null)
				|| this.x.full) + 'px',
		    height: (this.y.size || this.y.full) + 'px',
		    visibility: 'hidden',
		    overflow: 'hidden',
		    zIndex: hs.ie ? 4 : 'auto'
		},
		hs.container,
		true
	);
        },
        sizeOverlayBox: function(doWrapper, doPanels) {
            var overlayBox = this.overlayBox,
		x = this.x,
		y = this.y;
            hs.setStyles(overlayBox, {
                width: x.size + 'px',
                height: y.size + 'px'
            });
            if (doWrapper || doPanels) {
                for (var i = 0; i < this.overlays.length; i++) {
                    var o = hs.$('hsId' + this.overlays[i]);
                    var ie6 = (hs.ieLt7 || document.compatMode == 'BackCompat');
                    if (o && /^(above|below)$/.test(o.position)) {
                        if (ie6) {
                            o.style.width = (overlayBox.offsetWidth + 2 * x.cb
						+ x.p1 + x.p2) + 'px';
                        }
                        y[o.position == 'above' ? 'p1' : 'p2'] = o.offsetHeight;
                    }
                    if (o && ie6 && /^(left|right)panel$/.test(o.position)) {
                        o.style.height = (overlayBox.offsetHeight + 2 * y.cb) + 'px';
                    }
                }
            }
            if (doWrapper) {
                hs.setStyles(this.content, {
                    top: y.p1 + 'px'
                });
                hs.setStyles(overlayBox, {
                    top: (y.p1 + y.cb) + 'px'
                });
            }
        },

        showOverlays: function() {
            var b = this.overlayBox;
            b.className = '';
            hs.setStyles(b, {
                top: (this.y.p1 + this.y.cb) + 'px',
                left: (this.x.p1 + this.x.cb) + 'px',
                overflow: 'visible'
            });
            if (hs.safari) b.style.visibility = 'visible';
            this.wrapper.appendChild(b);
            for (var i = 0; i < this.overlays.length; i++) {
                var o = hs.$('hsId' + this.overlays[i]);
                o.style.zIndex = o.zIndex || 4;
                if (!o.hideOnMouseOut || this.mouseIsOver) {
                    o.style.visibility = 'visible';
                    hs.setStyles(o, { visibility: 'visible', display: '' });
                    hs.animate(o, { opacity: o.opacity }, o.dur);
                }
            }
        },

        destroyOverlays: function() {
            if (!this.overlays.length) return;
            if (this.slideshow) {
                var c = this.slideshow.controls;
                if (c && hs.getExpander(c) == this) c.parentNode.removeChild(c);
            }
            for (var i = 0; i < this.overlays.length; i++) {
                var o = hs.$('hsId' + this.overlays[i]);
                if (o && o.parentNode == hs.viewport && hs.getExpander(o) == this) hs.discardElement(o);
            }
            if (this.isHtml && this.preserveContent) {
                this.overlayBox.style.top = '-9999px';
                hs.container.appendChild(this.overlayBox);
            } else
                hs.discardElement(this.overlayBox);
        },



        createFullExpand: function() {
            if (this.slideshow && this.slideshow.controls) {
                this.slideshow.enable('full-expand');
                return;
            }
            this.fullExpandLabel = hs.createElement(
		'a', {
		    href: 'javascript:hs.expanders[' + this.key + '].doFullExpand();',
		    title: hs.lang.fullExpandTitle,
		    className: 'highslide-full-expand'
		}
	);
            if (!hs.fireEvent(this, 'onCreateFullExpand')) return;

            this.createOverlay({
                overlayId: this.fullExpandLabel,
                position: hs.fullExpandPosition,
                hideOnMouseOut: true,
                opacity: hs.fullExpandOpacity
            });
        },

        doFullExpand: function() {
            try {
                if (!hs.fireEvent(this, 'onDoFullExpand')) return;
                if (this.fullExpandLabel) hs.discardElement(this.fullExpandLabel);

                this.focus();
                var xSize = this.x.size;
                this.resizeTo(this.x.full, this.y.full);

                var xpos = this.x.pos - (this.x.size - xSize) / 2;
                if (xpos < hs.marginLeft) xpos = hs.marginLeft;

                this.moveTo(xpos, this.y.pos);
                this.doShowHide('hidden');

            } catch (e) {
                this.error(e);
            }
        },


        afterClose: function() {
            this.a.className = this.a.className.replace('highslide-active-anchor', '');

            this.doShowHide('visible');

            if (this.isHtml && this.preserveContent
			 && this.transitions[1] != 'crossfade') {
                this.sleep();
            } else {
                if (this.outline && this.outlineWhileAnimating) this.outline.destroy();

                hs.discardElement(this.wrapper);
            }
            if (hs.mask) hs.mask.style.display = 'none';
            this.destroyOverlays();
            if (!hs.viewport.childNodes.length) hs.viewport.style.display = 'none';

            if (this.dimmingOpacity) hs.undim(this.key);
            hs.fireEvent(this, 'onAfterClose');
            hs.expanders[this.key] = null;
            hs.reOrder();
        }

    };


    // hs.Ajax object prototype
    hs.Ajax = function(a, content, pre) {
        this.a = a;
        this.content = content;
        this.pre = pre;
    };

    hs.Ajax.prototype = {
        run: function() {
            var xhr;
            if (!this.src) this.src = hs.getSrc(this.a);
            if (this.src.match('#')) {
                var arr = this.src.split('#');
                this.src = arr[0];
                this.id = arr[1];
            }
            if (hs.cachedGets[this.src]) {
                this.cachedGet = hs.cachedGets[this.src];
                if (this.id) this.getElementContent();
                else this.loadHTML();
                return;
            }
            try { xhr = new XMLHttpRequest(); }
            catch (e) {
                try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); }
                catch (e) {
                    try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
                    catch (e) { this.onError(); }
                }
            }
            var pThis = this;
            xhr.onreadystatechange = function() {
                if (pThis.xhr.readyState == 4) {
                    if (pThis.id) pThis.getElementContent();
                    else pThis.loadHTML();
                }
            };
            var src = this.src;
            this.xhr = xhr;
            if (hs.forceAjaxReload)
                src = src.replace(/$/, (/\?/.test(src) ? '&' : '?') + 'dummy=' + (new Date()).getTime());
            xhr.open('GET', src, true);
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.send(null);
        },

        getElementContent: function() {
            hs.init();
            var attribs = window.opera || hs.ie6SSL ? { src: 'about:blank'} : null;

            this.iframe = hs.createElement('iframe', attribs,
		{ position: 'absolute', top: '-9999px' }, hs.container);

            this.loadHTML();
        },

        loadHTML: function() {
            var s = this.cachedGet || this.xhr.responseText,
		regBody;
            if (this.pre) hs.cachedGets[this.src] = s;
            if (!hs.ie || hs.uaVersion >= 5.5) {
                s = s.replace(new RegExp('<link[^>]*>', 'gi'), '')
			.replace(new RegExp('<script[^>]*>.*?</script>', 'gi'), '');
                if (this.iframe) {
                    var doc = this.iframe.contentDocument;
                    if (!doc && this.iframe.contentWindow) doc = this.iframe.contentWindow.document;
                    if (!doc) { // Opera
                        var pThis = this;
                        setTimeout(function() { pThis.loadHTML(); }, 25);
                        return;
                    }
                    doc.open();
                    doc.write(s);
                    doc.close();
                    try { s = doc.getElementById(this.id).innerHTML; } catch (e) {
                        try { s = this.iframe.document.getElementById(this.id).innerHTML; } catch (e) { } // opera
                    }
                    hs.discardElement(this.iframe);
                } else {
                    regBody = /(<body[^>]*>|<\/body>)/ig;
                    if (regBody.test(s)) s = s.split(regBody)[hs.ie ? 1 : 2];

                }
            }
            hs.getElementByClass(this.content, 'DIV', 'highslide-body').innerHTML = s;
            this.onLoad();
            for (var x in this) this[x] = null;
        }
    };


    hs.Slideshow = function(expKey, options) {
        if (hs.dynamicallyUpdateAnchors !== false) hs.updateAnchors();
        this.expKey = expKey;
        for (var x in options) this[x] = options[x];
        if (this.useControls) this.getControls();
        if (this.thumbstrip) this.thumbstrip = hs.Thumbstrip(this);
    };
    hs.Slideshow.prototype = {
        getControls: function() {
            this.controls = hs.createElement('div', { innerHTML: hs.replaceLang(hs.skin.controls) },
		null, hs.container);

            var buttons = ['play', 'pause', 'previous', 'next', 'move', 'full-expand', 'close'];
            this.btn = {};
            var pThis = this;
            for (var i = 0; i < buttons.length; i++) {
                this.btn[buttons[i]] = hs.getElementByClass(this.controls, 'li', 'highslide-' + buttons[i]);
                this.enable(buttons[i]);
            }
            this.btn.pause.style.display = 'none';
            //this.disable('full-expand');
        },
        checkFirstAndLast: function() {
            if (this.repeat || !this.controls) return;
            var exp = hs.expanders[this.expKey],
		cur = exp.getAnchorIndex(),
		re = /disabled$/;
            if (cur == 0)
                this.disable('previous');
            else if (re.test(this.btn.previous.getElementsByTagName('a')[0].className))
                this.enable('previous');
            if (cur + 1 == hs.anchors.groups[exp.slideshowGroup || 'none'].length) {
                this.disable('next');
                this.disable('play');
            } else if (re.test(this.btn.next.getElementsByTagName('a')[0].className)) {
                this.enable('next');
                this.enable('play');
            }
        },
        enable: function(btn) {
            if (!this.btn) return;
            var sls = this, a = this.btn[btn].getElementsByTagName('a')[0], re = /disabled$/;
            a.onclick = function() {
                sls[btn]();
                return false;
            };
            if (re.test(a.className)) a.className = a.className.replace(re, '');
        },
        disable: function(btn) {
            if (!this.btn) return;
            var a = this.btn[btn].getElementsByTagName('a')[0];
            a.onclick = function() { return false; };
            if (!/disabled$/.test(a.className)) a.className += ' disabled';
        },
        hitSpace: function() {
            if (this.autoplay) this.pause();
            else this.play();
        },
        play: function(wait) {
            if (this.btn) {
                this.btn.play.style.display = 'none';
                this.btn.pause.style.display = '';
            }

            this.autoplay = true;
            if (!wait) hs.next(this.expKey);
        },
        pause: function() {
            if (this.btn) {
                this.btn.pause.style.display = 'none';
                this.btn.play.style.display = '';
            }

            clearTimeout(this.autoplay);
            this.autoplay = null;
        },
        previous: function() {
            this.pause();
            hs.previous(this.btn.previous);
        },
        next: function() {
            this.pause();
            hs.next(this.btn.next);
        },
        move: function() { },
        'full-expand': function() {
            hs.getExpander().doFullExpand();
        },
        close: function() {
            hs.close(this.btn.close);
        }
    };
    hs.Thumbstrip = function(slideshow) {
        function add(exp) {
            hs.extend(options || {}, {
                overlayId: dom,
                hsId: 'thumbstrip',
                className: 'highslide-thumbstrip-' + mode + '-overlay ' + (options.className || '')
            });
            if (hs.ieLt7) options.fade = 0;
            exp.createOverlay(options);
            hs.setStyles(dom.parentNode, { overflow: 'hidden' });
        };

        function scroll(delta) {
            selectThumb(undefined, Math.round(delta * dom[isX ? 'offsetWidth' : 'offsetHeight'] * 0.7));
        };

        function selectThumb(i, scrollBy) {
            if (i === undefined) for (var j = 0; j < group.length; j++) {
                if (group[j] == hs.expanders[slideshow.expKey].a) {
                    i = j;
                    break;
                }
            }
            if (i === undefined) return;
            var as = dom.getElementsByTagName('a'),
			active = as[i],
			cell = active.parentNode,
			left = isX ? 'Left' : 'Top',
			right = isX ? 'Right' : 'Bottom',
			width = isX ? 'Width' : 'Height',
			offsetLeft = 'offset' + left,
			offsetWidth = 'offset' + width,
			overlayWidth = div.parentNode.parentNode[offsetWidth],
			minTblPos = overlayWidth - table[offsetWidth],
			curTblPos = parseInt(table.style[isX ? 'left' : 'top']) || 0,
			tblPos = curTblPos,
			mgnRight = 20;
            if (scrollBy !== undefined) {
                tblPos = curTblPos - scrollBy;

                if (minTblPos > 0) minTblPos = 0;
                if (tblPos > 0) tblPos = 0;
                if (tblPos < minTblPos) tblPos = minTblPos;


            } else {
                for (var j = 0; j < as.length; j++) as[j].className = '';
                active.className = 'highslide-active-anchor';
                var activeLeft = i > 0 ? as[i - 1].parentNode[offsetLeft] : cell[offsetLeft],
				activeRight = cell[offsetLeft] + cell[offsetWidth] +
					(as[i + 1] ? as[i + 1].parentNode[offsetWidth] : 0);
                if (activeRight > overlayWidth - curTblPos) tblPos = overlayWidth - activeRight;
                else if (activeLeft < -curTblPos) tblPos = -activeLeft;
            }
            var markerPos = cell[offsetLeft] + (cell[offsetWidth] - marker[offsetWidth]) / 2 + tblPos;
            hs.animate(table, isX ? { left: tblPos} : { top: tblPos }, null, 'easeOutQuad');
            hs.animate(marker, isX ? { left: markerPos} : { top: markerPos }, null, 'easeOutQuad');
            scrollUp.style.display = tblPos < 0 ? 'block' : 'none';
            scrollDown.style.display = (tblPos > minTblPos) ? 'block' : 'none';

        };


        // initialize
        var group = hs.anchors.groups[hs.expanders[slideshow.expKey].slideshowGroup || 'none'],
		options = slideshow.thumbstrip,
		mode = options.mode || 'horizontal',
		floatMode = (mode == 'float'),
		tree = floatMode ? ['div', 'ul', 'li', 'span'] : ['table', 'tbody', 'tr', 'td'],
		isX = (mode == 'horizontal'),
		dom = hs.createElement('div', {
		    className: 'highslide-thumbstrip highslide-thumbstrip-' + mode,
		    innerHTML:
					'<div class="highslide-thumbstrip-inner">' +
					'<' + tree[0] + '><' + tree[1] + '></' + tree[1] + '></' + tree[0] + '></div>' +
					'<div class="highslide-scroll-up"><div></div></div>' +
					'<div class="highslide-scroll-down"><div></div></div>' +
					'<div class="highslide-marker"><div></div></div>'
		}, {
		    display: 'none'
		}, hs.container),
		domCh = dom.childNodes,
		div = domCh[0],
		scrollUp = domCh[1],
		scrollDown = domCh[2],
		marker = domCh[3],
		table = div.firstChild,
		tbody = dom.getElementsByTagName(tree[1])[0],
		tr;
        for (var i = 0; i < group.length; i++) {
            if (i == 0 || !isX) tr = hs.createElement(tree[2], null, null, tbody);
            (function() {
                var a = group[i],
				cell = hs.createElement(tree[3], null, null, tr),
				pI = i;
                hs.createElement('a', {
                    href: a.href,
                    onclick: function() {
                        hs.getExpander(this).focus();
                        return hs.transit(a);
                    },
                    innerHTML: hs.stripItemFormatter ? hs.stripItemFormatter(a) : a.innerHTML
                }, null, cell);
            })();
        }
        if (!floatMode) {
            scrollUp.onclick = function() { scroll(-1); };
            scrollDown.onclick = function() { scroll(1); };
            hs.addEventListener(tbody, document.onmousewheel !== undefined ?
				'mousewheel' : 'DOMMouseScroll', function(e) {
				    var delta = 0;
				    e = e || window.event;
				    if (e.wheelDelta) {
				        delta = e.wheelDelta / 120;
				        if (hs.opera) delta = -delta;
				    } else if (e.detail) {
				        delta = -e.detail / 3;
				    }
				    if (delta) scroll(-delta * 0.2);
				    if (e.preventDefault) e.preventDefault();
				    e.returnValue = false;
				});
        }

        return {
            add: add,
            selectThumb: selectThumb
        }
    };
    hs.langDefaults = hs.lang;
    // history
    var HsExpander = hs.Expander;
    if (hs.ie && window == window.top) {
        (function() {
            try {
                document.documentElement.doScroll('left');
            } catch (e) {
                setTimeout(arguments.callee, 50);
                return;
            }
            hs.ready();
        })();
    }
    hs.addEventListener(document, 'DOMContentLoaded', hs.ready);
    hs.addEventListener(window, 'load', hs.ready);

    // set handlers
    hs.addEventListener(document, 'ready', function() {
        if (hs.expandCursor || hs.dimmingOpacity) {
            var style = hs.createElement('style', { type: 'text/css' }, null,
			document.getElementsByTagName('HEAD')[0]);

            function addRule(sel, dec) {
                if (!hs.ie) {
                    style.appendChild(document.createTextNode(sel + " {" + dec + "}"));
                } else {
                    var last = document.styleSheets[document.styleSheets.length - 1];
                    if (typeof (last.addRule) == "object") last.addRule(sel, dec);
                }
            }
            function fix(prop) {
                return 'expression( ( ( ignoreMe = document.documentElement.' + prop +
				' ? document.documentElement.' + prop + ' : document.body.' + prop + ' ) ) + \'px\' );';
            }
            if (hs.expandCursor) addRule('.highslide img',
			'cursor: url(' + hs.graphicsDir + hs.expandCursor + '), pointer !important;');
            addRule('.highslide-viewport-size',
			hs.ie && (hs.uaVersion < 7 || document.compatMode == 'BackCompat') ?
				'position: absolute; ' +
				'left:' + fix('scrollLeft') +
				'top:' + fix('scrollTop') +
				'width:' + fix('clientWidth') +
				'height:' + fix('clientHeight') :
				'position: fixed; width: 100%; height: 100%; left: 0; top: 0');
        }
    });
    hs.addEventListener(window, 'resize', function() {
        hs.getPageSize();
        if (hs.viewport) for (var i = 0; i < hs.viewport.childNodes.length; i++) {
            var node = hs.viewport.childNodes[i],
			exp = hs.getExpander(node);
            exp.positionOverlay(node);
            if (node.hsId == 'thumbstrip') exp.slideshow.thumbstrip.selectThumb();
        }
    });
    hs.addEventListener(document, 'mousemove', function(e) {
        hs.mouse = { x: e.clientX, y: e.clientY };
    });
    hs.addEventListener(document, 'mousedown', hs.mouseClickHandler);
    hs.addEventListener(document, 'mouseup', hs.mouseClickHandler);
    hs.addEventListener(document, 'ready', hs.setClickEvents);
    hs.addEventListener(window, 'load', hs.preloadImages);
    hs.addEventListener(window, 'load', hs.preloadAjax);
}

/******************************************************************************************************/
//    <script src="<%= resolveclienturl("~/video/swfobject.js") %>" type="text/javascript"></script>
/******************************************************************************************************/
/**
* SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
*
* SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
*/
if (typeof deconcept == "undefined") { var deconcept = new Object(); } if (typeof deconcept.util == "undefined") { deconcept.util = new Object(); } if (typeof deconcept.SWFObjectUtil == "undefined") { deconcept.SWFObjectUtil = new Object(); } deconcept.SWFObject = function(_1, id, w, h, _5, c, _7, _8, _9, _a) { if (!document.getElementById) { return; } this.DETECT_KEY = _a ? _a : "detectflash"; this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY); this.params = new Object(); this.variables = new Object(); this.attributes = new Array(); if (_1) { this.setAttribute("swf", _1); } if (id) { this.setAttribute("id", id); } if (w) { this.setAttribute("width", w); } if (h) { this.setAttribute("height", h); } if (_5) { this.setAttribute("version", new deconcept.PlayerVersion(_5.toString().split("."))); } this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion(); if (!window.opera && document.all && this.installedVer.major > 7) { deconcept.SWFObject.doPrepUnload = true; } if (c) { this.addParam("bgcolor", c); } var q = _7 ? _7 : "high"; this.addParam("quality", q); this.setAttribute("useExpressInstall", false); this.setAttribute("doExpressInstall", false); var _c = (_8) ? _8 : window.location; this.setAttribute("xiRedirectUrl", _c); this.setAttribute("redirectUrl", ""); if (_9) { this.setAttribute("redirectUrl", _9); } }; deconcept.SWFObject.prototype = { useExpressInstall: function(_d) { this.xiSWFPath = !_d ? "expressinstall.swf" : _d; this.setAttribute("useExpressInstall", true); }, setAttribute: function(_e, _f) { this.attributes[_e] = _f; }, getAttribute: function(_10) { return this.attributes[_10]; }, addParam: function(_11, _12) { this.params[_11] = _12; }, getParams: function() { return this.params; }, addVariable: function(_13, _14) { this.variables[_13] = _14; }, getVariable: function(_15) { return this.variables[_15]; }, getVariables: function() { return this.variables; }, getVariablePairs: function() { var _16 = new Array(); var key; var _18 = this.getVariables(); for (key in _18) { _16[_16.length] = key + "=" + _18[key]; } return _16; }, getSWFHTML: function() { var _19 = ""; if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "PlugIn"); this.setAttribute("swf", this.xiSWFPath); } _19 = "<embed type=\"application/x-shockwave-flash\" src=\"" + this.getAttribute("swf") + "\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\" style=\"" + this.getAttribute("style") + "\""; _19 += " id=\"" + this.getAttribute("id") + "\" name=\"" + this.getAttribute("id") + "\" "; var _1a = this.getParams(); for (var key in _1a) { _19 += [key] + "=\"" + _1a[key] + "\" "; } var _1c = this.getVariablePairs().join("&"); if (_1c.length > 0) { _19 += "flashvars=\"" + _1c + "\""; } _19 += "/>"; } else { if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "ActiveX"); this.setAttribute("swf", this.xiSWFPath); } _19 = "<object id=\"" + this.getAttribute("id") + "\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\" style=\"" + this.getAttribute("style") + "\">"; _19 += "<param name=\"movie\" value=\"" + this.getAttribute("swf") + "\" />"; var _1d = this.getParams(); for (var key in _1d) { _19 += "<param name=\"" + key + "\" value=\"" + _1d[key] + "\" />"; } var _1f = this.getVariablePairs().join("&"); if (_1f.length > 0) { _19 += "<param name=\"flashvars\" value=\"" + _1f + "\" />"; } _19 += "</object>"; } return _19; }, write: function(_20) { if (this.getAttribute("useExpressInstall")) { var _21 = new deconcept.PlayerVersion([6, 0, 65]); if (this.installedVer.versionIsValid(_21) && !this.installedVer.versionIsValid(this.getAttribute("version"))) { this.setAttribute("doExpressInstall", true); this.addVariable("MMredirectURL", escape(this.getAttribute("xiRedirectUrl"))); document.title = document.title.slice(0, 47) + " - Flash Player Installation"; this.addVariable("MMdoctitle", document.title); } } if (this.skipDetect || this.getAttribute("doExpressInstall") || this.installedVer.versionIsValid(this.getAttribute("version"))) { var n = (typeof _20 == "string") ? document.getElementById(_20) : _20; n.innerHTML = this.getSWFHTML(); return true; } else { if (this.getAttribute("redirectUrl") != "") { document.location.replace(this.getAttribute("redirectUrl")); } } return false; } }; deconcept.SWFObjectUtil.getPlayerVersion = function() { var _23 = new deconcept.PlayerVersion([0, 0, 0]); if (navigator.plugins && navigator.mimeTypes.length) { var x = navigator.plugins["Shockwave Flash"]; if (x && x.description) { _23 = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".")); } } else { if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0) { var axo = 1; var _26 = 3; while (axo) { try { _26++; axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + _26); _23 = new deconcept.PlayerVersion([_26, 0, 0]); } catch (e) { axo = null; } } } else { try { var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); } catch (e) { try { var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); _23 = new deconcept.PlayerVersion([6, 0, 21]); axo.AllowScriptAccess = "always"; } catch (e) { if (_23.major == 6) { return _23; } } try { axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); } catch (e) { } } if (axo != null) { _23 = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(",")); } } } return _23; }; deconcept.PlayerVersion = function(_29) { this.major = _29[0] != null ? parseInt(_29[0]) : 0; this.minor = _29[1] != null ? parseInt(_29[1]) : 0; this.rev = _29[2] != null ? parseInt(_29[2]) : 0; }; deconcept.PlayerVersion.prototype.versionIsValid = function(fv) { if (this.major < fv.major) { return false; } if (this.major > fv.major) { return true; } if (this.minor < fv.minor) { return false; } if (this.minor > fv.minor) { return true; } if (this.rev < fv.rev) { return false; } return true; }; deconcept.util = { getRequestParameter: function(_2b) { var q = document.location.search || document.location.hash; if (_2b == null) { return q; } if (q) { var _2d = q.substring(1).split("&"); for (var i = 0; i < _2d.length; i++) { if (_2d[i].substring(0, _2d[i].indexOf("=")) == _2b) { return _2d[i].substring((_2d[i].indexOf("=") + 1)); } } } return ""; } }; deconcept.SWFObjectUtil.cleanupSWFs = function() { var _2f = document.getElementsByTagName("OBJECT"); for (var i = _2f.length - 1; i >= 0; i--) { _2f[i].style.display = "none"; for (var x in _2f[i]) { if (typeof _2f[i][x] == "function") { _2f[i][x] = function() { }; } } } }; if (deconcept.SWFObject.doPrepUnload) { if (!deconcept.unloadSet) { deconcept.SWFObjectUtil.prepUnload = function() { __flash_unloadHandler = function() { }; __flash_savedUnloadHandler = function() { }; window.attachEvent("onunload", deconcept.SWFObjectUtil.cleanupSWFs); }; window.attachEvent("onbeforeunload", deconcept.SWFObjectUtil.prepUnload); deconcept.unloadSet = true; } } if (!document.getElementById && document.all) { document.getElementById = function(id) { return document.all[id]; }; } var getQueryParamValue = deconcept.util.getRequestParameter; var FlashObject = deconcept.SWFObject; var SWFObject = deconcept.SWFObject;

/******************************************************************************************************/
//    <script src="<%= resolveclienturl("~/video/standard.js") %>" type="text/javascript"></script>
/******************************************************************************************************/
/**
* 
* Copyright 2007
* 
* Paulius Uza
* http://www.uza.lt
* 
* Dan Florio
* http://www.polygeek.com
* 
* Project website:
* http://code.google.com/p/custom-context-menu/
* 
* --
* RightClick for Flash Player. 
* Version 0.6.2
* 
*/

var RightClick = {
    /**
    *  Constructor
    */
    init: function() {
        this.FlashObjectID = "Captivate";
        this.FlashContainerID = "CaptivateContent";
        this.Cache = this.FlashObjectID;
        if (window.addEventListener) {
            window.addEventListener("mousedown", this.onGeckoMouse(), true);
        } else {
            document.getElementById(this.FlashContainerID).onmouseup = function() { document.getElementById(RightClick.FlashContainerID).releaseCapture(); }
            document.oncontextmenu = function() { if (window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; } }
            document.getElementById(this.FlashContainerID).onmousedown = RightClick.onIEMouse;
        }
    },
    /**
    * GECKO / WEBKIT event overkill
    * @param {Object} eventObject
    */
    killEvents: function(eventObject) {
        if (eventObject) {
            if (eventObject.stopPropagation) eventObject.stopPropagation();
            if (eventObject.preventDefault) eventObject.preventDefault();
            if (eventObject.preventCapture) eventObject.preventCapture();
            if (eventObject.preventBubble) eventObject.preventBubble();
        }
    },
    /**
    * GECKO / WEBKIT call right click
    * @param {Object} ev
    */
    onGeckoMouse: function(ev) {
        return function(ev) {
            if (ev.button == 2) {
                RightClick.killEvents(ev);
                if (ev.target.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
                    RightClick.call();
                }
                RightClick.Cache = ev.target.id;
            }
        }
    },
    /**
    * IE call right click
    * @param {Object} ev
    */
    onIEMouse: function() {
        if (event.button == 2) {
            if (window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
                RightClick.call();
            }
            document.getElementById(RightClick.FlashContainerID).setCapture();
            if (window.event.srcElement.id)
                RightClick.Cache = window.event.srcElement.id;
        }
    },
    /**
    * Main call to Flash External Interface
    */
    call: function() {
        document.getElementById(this.FlashObjectID).rightClick();
    }
}

/**
* SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
*
* SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
*/


if (typeof deconcept == "undefined") { var deconcept = new Object(); } if (typeof deconcept.util == "undefined") { deconcept.util = new Object(); } if (typeof deconcept.SWFObjectUtil == "undefined") { deconcept.SWFObjectUtil = new Object(); } deconcept.SWFObject = function(_1, id, w, h, _5, c, _7, _8, _9, _a) { if (!document.getElementById) { return; } this.DETECT_KEY = _a ? _a : "detectflash"; this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY); this.params = new Object(); this.variables = new Object(); this.attributes = new Array(); if (_1) { this.setAttribute("swf", _1); } if (id) { this.setAttribute("id", id); } if (w) { this.setAttribute("width", w); } if (h) { this.setAttribute("height", h); } if (_5) { this.setAttribute("version", new deconcept.PlayerVersion(_5.toString().split("."))); } this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion(); if (!window.opera && document.all && this.installedVer.major > 7) { deconcept.SWFObject.doPrepUnload = true; } if (c) { this.addParam("bgcolor", c); } var q = _7 ? _7 : "high"; this.addParam("quality", q); this.setAttribute("useExpressInstall", false); this.setAttribute("doExpressInstall", false); var _c = (_8) ? _8 : window.location; this.setAttribute("xiRedirectUrl", _c); this.setAttribute("redirectUrl", ""); if (_9) { this.setAttribute("redirectUrl", _9); } }; deconcept.SWFObject.prototype = { useExpressInstall: function(_d) { this.xiSWFPath = !_d ? "expressinstall.swf" : _d; this.setAttribute("useExpressInstall", true); }, setAttribute: function(_e, _f) { this.attributes[_e] = _f; }, getAttribute: function(_10) { return this.attributes[_10]; }, addParam: function(_11, _12) { this.params[_11] = _12; }, getParams: function() { return this.params; }, addVariable: function(_13, _14) { this.variables[_13] = _14; }, getVariable: function(_15) { return this.variables[_15]; }, getVariables: function() { return this.variables; }, getVariablePairs: function() { var _16 = new Array(); var key; var _18 = this.getVariables(); for (key in _18) { _16[_16.length] = key + "=" + _18[key]; } return _16; }, getSWFHTML: function() { var _19 = ""; if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "PlugIn"); this.setAttribute("swf", this.xiSWFPath); } _19 = "<embed type=\"application/x-shockwave-flash\" src=\"" + this.getAttribute("swf") + "\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\" style=\"" + this.getAttribute("style") + "\""; _19 += " id=\"" + this.getAttribute("id") + "\" name=\"" + this.getAttribute("id") + "\" "; var _1a = this.getParams(); for (var key in _1a) { _19 += [key] + "=\"" + _1a[key] + "\" "; } var _1c = this.getVariablePairs().join("&"); if (_1c.length > 0) { _19 += "flashvars=\"" + _1c + "\""; } _19 += "/>"; } else { if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "ActiveX"); this.setAttribute("swf", this.xiSWFPath); } _19 = "<object id=\"" + this.getAttribute("id") + "\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\" style=\"" + this.getAttribute("style") + "\">"; _19 += "<param name=\"movie\" value=\"" + this.getAttribute("swf") + "\" />"; var _1d = this.getParams(); for (var key in _1d) { _19 += "<param name=\"" + key + "\" value=\"" + _1d[key] + "\" />"; } var _1f = this.getVariablePairs().join("&"); if (_1f.length > 0) { _19 += "<param name=\"flashvars\" value=\"" + _1f + "\" />"; } _19 += "</object>"; } return _19; }, write: function(_20) { if (this.getAttribute("useExpressInstall")) { var _21 = new deconcept.PlayerVersion([6, 0, 65]); if (this.installedVer.versionIsValid(_21) && !this.installedVer.versionIsValid(this.getAttribute("version"))) { this.setAttribute("doExpressInstall", true); this.addVariable("MMredirectURL", escape(this.getAttribute("xiRedirectUrl"))); document.title = document.title.slice(0, 47) + " - Flash Player Installation"; this.addVariable("MMdoctitle", document.title); } } if (this.skipDetect || this.getAttribute("doExpressInstall") || this.installedVer.versionIsValid(this.getAttribute("version"))) { var n = (typeof _20 == "string") ? document.getElementById(_20) : _20; n.innerHTML = this.getSWFHTML(); return true; } else { if (this.getAttribute("redirectUrl") != "") { document.location.replace(this.getAttribute("redirectUrl")); } } return false; } }; deconcept.SWFObjectUtil.getPlayerVersion = function() { var _23 = new deconcept.PlayerVersion([0, 0, 0]); if (navigator.plugins && navigator.mimeTypes.length) { var x = navigator.plugins["Shockwave Flash"]; if (x && x.description) { _23 = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".")); } } else { if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0) { var axo = 1; var _26 = 3; while (axo) { try { _26++; axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + _26); _23 = new deconcept.PlayerVersion([_26, 0, 0]); } catch (e) { axo = null; } } } else { try { var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); } catch (e) { try { var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); _23 = new deconcept.PlayerVersion([6, 0, 21]); axo.AllowScriptAccess = "always"; } catch (e) { if (_23.major == 6) { return _23; } } try { axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); } catch (e) { } } if (axo != null) { _23 = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(",")); } } } return _23; }; deconcept.PlayerVersion = function(_29) { this.major = _29[0] != null ? parseInt(_29[0]) : 0; this.minor = _29[1] != null ? parseInt(_29[1]) : 0; this.rev = _29[2] != null ? parseInt(_29[2]) : 0; }; deconcept.PlayerVersion.prototype.versionIsValid = function(fv) { if (this.major < fv.major) { return false; } if (this.major > fv.major) { return true; } if (this.minor < fv.minor) { return false; } if (this.minor > fv.minor) { return true; } if (this.rev < fv.rev) { return false; } return true; }; deconcept.util = { getRequestParameter: function(_2b) { var q = document.location.search || document.location.hash; if (_2b == null) { return q; } if (q) { var _2d = q.substring(1).split("&"); for (var i = 0; i < _2d.length; i++) { if (_2d[i].substring(0, _2d[i].indexOf("=")) == _2b) { return _2d[i].substring((_2d[i].indexOf("=") + 1)); } } } return ""; } }; deconcept.SWFObjectUtil.cleanupSWFs = function() { var _2f = document.getElementsByTagName("OBJECT"); for (var i = _2f.length - 1; i >= 0; i--) { _2f[i].style.display = "none"; for (var x in _2f[i]) { if (typeof _2f[i][x] == "function") { _2f[i][x] = function() { }; } } } }; if (deconcept.SWFObject.doPrepUnload) { if (!deconcept.unloadSet) { deconcept.SWFObjectUtil.prepUnload = function() { __flash_unloadHandler = function() { }; __flash_savedUnloadHandler = function() { }; window.attachEvent("onunload", deconcept.SWFObjectUtil.cleanupSWFs); }; window.attachEvent("onbeforeunload", deconcept.SWFObjectUtil.prepUnload); deconcept.unloadSet = true; } } if (!document.getElementById && document.all) { document.getElementById = function(id) { return document.all[id]; }; } var getQueryParamValue = deconcept.util.getRequestParameter; var FlashObject = deconcept.SWFObject; var SWFObject = deconcept.SWFObject;



//Copyright 2006 Adobe Systems, Inc. All rights reserved.
//
//This is the base class for implementing an Active Content extension -- a piece of code that knows how to rewrite OBJECT tags so that they comply to the Eolas patent without making the browser display the "Press OK to continue loading the content of this page" message box.
//
// When the user hovers the mouse over an ActiveX control in Internet Explorer 6 updated with (April 2006) Cumulative Security Update (912812) or Internet Explorer 7, the following message is displayed:
// “Press Spacebar or Enter to activate and use this control.”
// The user can now click the mouse anywhere inside the ActiveX control area, or press the Spacebar or Enter key to activate the control.
// The standard.js file has been introduced to retain the earlier behavior where the control remains interactive from the first click to the last.

function writeDocument(s) { document.write(s); }


/******************************************************************************************************/
//    <script src="<%= resolveclienturl("~/js/videoRes.js") %>" type="text/javascript"></script>
/******************************************************************************************************/


// Simulate Request on html page
request = new Array();


qsStartPos = window.location.href.lastIndexOf('?');

if (qsStartPos != -1) {
    qs = window.location.href.substr(qsStartPos + 1);
    qsArrayTemp = (qs.split('&'));

    for (i = 0; i < qsArrayTemp.length; i++) {
        element = qsArrayTemp[i].split('=');
        request[element[0]] = element[1];
    }
}

if (!request['videoRes'])
    request['videoRes'] = '';

switch (request['videoRes'].toLowerCase()) {
    //Features-MultipleProjectManagement.htm 
    case 'sd1':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd1':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-MultipleResourceManagement.htm 
    case 'sd2':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd2':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-MultipleTaskManagement.htm 
    case 'sd3':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd3':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-TaskDependencies.htm  
    case 'sd4':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd4':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-ProjectStatsReports.htm   
    case 'sd5':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd5':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-GanttChart.htm    
    case 'sd6':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd6':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-Calendar.htm     
    case 'sd7':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd7':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-TimeTracking.htm   
    case 'sd8':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd8':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-UserWorkloadReport.htm     
    case 'sd9':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd9':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-SecurityAccessRights.htm     
    case 'sd10':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd10':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-EmailNotifications.htm     
    case 'sd11':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd1':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-DocumentManagement.htm    
    case 'sd12':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd12':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-ProjectTemplates.htm     
    case 'sd13':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd13':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-CSVImport.htm     
    case 'sd14':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd14':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-Export.htm     
    case 'sd15':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd15':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-CustomTaskReports.htm     
    case 'sd16':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd16':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-MessageCenter.htm     
    case 'sd17':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd17':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-ResourcePreferences.htm     
    case 'sd18':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd18':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-DiscussionForum.htm     
    case 'sd19':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd19':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-InternationalCharacters.htm     
    case 'sd20':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd20':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-TaskReminder.htm      
    case 'sd21':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd21':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //Features-Branding.htm  
    case 'sd22':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd22':
        request['width'] = 1280;
        request['height'] = 745;
        break;




    //Version 4.7 Overview - News and Updates     
    case 'sd23':
        request['width'] = 960;
        request['height'] = 565;
        break;
    case 'hd23':
        request['width'] = 1280;
        request['height'] = 745;
        break;

    //and so on... 


    //Default values 
    default:
        request['width'] = 960
        request['height'] = 565
        break;

}

/******************************************************************************************************/
//    <script src="<%= resolveclienturl("~/js/curvycorners.js") %>" type="text/javascript"></script>
/******************************************************************************************************/

/****************************************************************
*                                                              *
*  CurvyCorners                                                *
*  ------------                                                *
*                                                              *
*  This script generates rounded corners for your boxes.       *
*                                                              *
*  Version 2.0.4                                               *
*  Copyright (c) 2009 Cameron Cooke                            *
*  Contributors: Tim Hutchison, CPK Smithies, Terry Rigel      *
*                                                              *
*  Website: http://www.curvycorners.net                        *
*  SVN:     http://curvycorners.googlecode.com/                *
*  Email:   cameron@curvycorners.net                           *
*  Discuss: http://groups.google.com/group/curvycorners        *
*                                                              *
*  Please consult the SVN for a list of changes since the last *
*  revision.                                                   *
*                                                              *
*  This library is free software; you can redistribute         *
*  it and/or modify it under the terms of the GNU              *
*  Lesser General Public License as published by the           *
*  Free Software Foundation; either version 2.1 of the         *
*  License, or (at your option) any later version.             *
*                                                              *
*  This library is distributed in the hope that it will        *
*  be useful, but WITHOUT ANY WARRANTY; without even the       *
*  implied warranty of MERCHANTABILITY or FITNESS FOR A        *
*  PARTICULAR PURPOSE. See the GNU Lesser General Public       *
*  License for more details.                                   *
*                                                              *
*  You should have received a copy of the GNU Lesser           *
*  General Public License along with this library;             *
*  Inc., 59 Temple Place, Suite 330, Boston,                   *
*  MA 02111-1307 USA                                           *
*                                                              *
****************************************************************/

/*
Version 2.x now autoMagically applies borders via CSS rules.
Safari, Chrome and Mozilla support rounded borders via

-webkit-border-radius, -moz-border-radius

We let these browsers render their borders natively.
Firefox for Windows renders non-antialiased
borders so they look a bit ugly. Google's Chrome will render its "ugly"
borders as well. So if we let FireFox, Safari, and Chrome render their
borders natively, then we only have to support IE and Opera
for rounded borders. Fortunately IE reads CSS properties
that it doesn't understand (Opera, Firefox and Safari discard them);
so for IE and Opera we find and apply -webkit-border-radius and friends.

So to make curvycorners work with any major browser simply add the following
CSS declarations and it should be good to go...

.round {
-webkit-border-radius: 3ex;
-moz-border-radius: 3ex;
}

NB at present you must (for Opera's sake) include these styles in
the page itself.
*/

function browserdetect() {
    var agent = navigator.userAgent.toLowerCase();
    this.isIE = agent.indexOf("msie") > -1;
    this.ieVer = this.isIE ? /msie\s(\d\.\d)/.exec(agent)[1] : 0;
    this.isMoz = agent.indexOf('firefox') != -1;
    this.isSafari = agent.indexOf('safari') != -1;
    this.quirksMode = this.isIE && (!document.compatMode || document.compatMode.indexOf("BackCompat") > -1);
    this.isOp = 'opera' in window;
    this.isWebKit = agent.indexOf('webkit') != -1;
    if (this.isIE) {
        this.get_style = function(obj, prop) {
            if (!(prop in obj.currentStyle)) return "";
            var matches = /^([\d.]+)(\w*)/.exec(obj.currentStyle[prop]);
            if (!matches) return obj.currentStyle[prop];
            if (matches[1] == 0) return '0';
            // now convert to pixels if necessary
            if (matches[2] && matches[2] !== 'px') {
                var style = obj.style.left;
                var rtStyle = obj.runtimeStyle.left;
                obj.runtimeStyle.left = obj.currentStyle.left;
                obj.style.left = matches[1] + matches[2];
                matches[0] = obj.style.pixelLeft;
                obj.style.left = style;
                obj.runtimeStyle.left = rtStyle;
            }
            return matches[0];
        };
    }
    else {
        this.get_style = function(obj, prop) {
            prop = prop.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
            return document.defaultView.getComputedStyle(obj, '').getPropertyValue(prop);
        };
    }
}
var curvyBrowser = new browserdetect;

/* Force caching of bg images in IE6 */
if (curvyBrowser.isIE) {
    try {
        document.execCommand("BackgroundImageCache", false, true);
    }
    catch (e) { };
}

// object that parses border-radius properties for a box

function curvyCnrSpec(selText) {
    this.selectorText = selText;
    this.tlR = this.trR = this.blR = this.brR = 0;
    this.tlu = this.tru = this.blu = this.bru = "";
    this.antiAlias = true; // default true
}
curvyCnrSpec.prototype.setcorner = function(tb, lr, radius, unit) {
    if (!tb) { // no corner specified
        this.tlR = this.trR = this.blR = this.brR = parseInt(radius);
        this.tlu = this.tru = this.blu = this.bru = unit;
    }
    else { // corner specified
        propname = tb.charAt(0) + lr.charAt(0);
        this[propname + 'R'] = parseInt(radius);
        this[propname + 'u'] = unit;
    }
}
/*
get(propstring)
where propstring is:
- 'tR' or 'bR' : returns top or bottom radius.
- 'tlR', 'trR', 'blR' or 'brR' : returns top/bottom left/right radius.
- 'tlu', 'tru', 'blr' or 'bru' : returns t/b l/r unit (px, em...)
- 'tRu' or 'bRu' : returns top/bottom radius+unit
- 'tlRu', 'trRu', 'blRu', 'brRu' : returns t/b l/r radius+unit
*/
curvyCnrSpec.prototype.get = function(prop) {
    if (/^(t|b)(l|r)(R|u)$/.test(prop)) return this[prop];
    if (/^(t|b)(l|r)Ru$/.test(prop)) {
        var pname = prop.charAt(0) + prop.charAt(1);
        return this[pname + 'R'] + this[pname + 'u'];
    }
    if (/^(t|b)Ru?$/.test(prop)) {
        var tb = prop.charAt(0);
        tb += this[tb + 'lR'] > this[tb + 'rR'] ? 'l' : 'r';
        var retval = this[tb + 'R'];
        if (prop.length === 3 && prop.charAt(2) === 'u')
            retval += this[tb = 'u'];
        return retval;
    }
    throw new Error('Don\'t recognize property ' + prop);
}
curvyCnrSpec.prototype.radiusdiff = function(tb) {
    if (tb !== 't' && tb !== 'b') throw new Error("Param must be 't' or 'b'");
    return Math.abs(this[tb + 'lR'] - this[tb + 'rR']);
}
curvyCnrSpec.prototype.setfrom = function(obj) {
    this.tlu = this.tru = this.blu = this.bru = 'px'; // default to px
    if ('tl' in obj) this.tlR = obj.tl.radius;
    if ('tr' in obj) this.trR = obj.tr.radius;
    if ('bl' in obj) this.blR = obj.bl.radius;
    if ('br' in obj) this.brR = obj.br.radius;
    if ('antiAlias' in obj) this.antiAlias = obj.antiAlias;
};
curvyCnrSpec.prototype.cloneOn = function(box) { // not needed by IE
    var props = ['tl', 'tr', 'bl', 'br'];
    var converted = 0;
    var i, propu;

    for (i in props) if (!isNaN(i)) {
        propu = this[props[i] + 'u'];
        if (propu !== '' && propu !== 'px') {
            converted = new curvyCnrSpec;
            break;
        }
    }
    if (!converted)
        converted = this; // no need to clone
    else {
        var propi, propR, save = curvyBrowser.get_style(box, 'left');
        for (i in props) if (!isNaN(i)) {
            propi = props[i];
            propu = this[propi + 'u'];
            propR = this[propi + 'R'];
            if (propu !== 'px') {
                var save = box.style.left;
                box.style.left = propR + propu;
                propR = box.style.pixelLeft;
                box.style.left = save;
            }
            converted[propi + 'R'] = propR;
            converted[propi + 'u'] = 'px';
        }
        box.style.left = save;
    }
    return converted;
}
curvyCnrSpec.prototype.radiusSum = function(tb) {
    if (tb !== 't' && tb !== 'b') throw new Error("Param must be 't' or 'b'");
    return this[tb + 'lR'] + this[tb + 'rR'];
}
curvyCnrSpec.prototype.radiusCount = function(tb) {
    var count = 0;
    if (this[tb + 'lR']) ++count;
    if (this[tb + 'rR']) ++count;
    return count;
}
curvyCnrSpec.prototype.cornerNames = function() {
    var ret = [];
    if (this.tlR) ret.push('tl');
    if (this.trR) ret.push('tr');
    if (this.blR) ret.push('bl');
    if (this.brR) ret.push('br');
    return ret;
}

/*
Object that parses Opera CSS
*/
function operasheet(sheetnumber) {
    var txt = document.styleSheets.item(sheetnumber).ownerNode.text;
    txt = txt.replace(/\/\*(\n|\r|.)*?\*\//g, ''); // strip comments
    // this pattern extracts all border-radius-containing rulesets
    // matches will be:
    // [0] = the whole lot
    // [1] = the selector text
    // [2] = all the rule text between braces
    // [3] = top/bottom and left/right parts if present (only if webkit/CSS3)
    // [4] = top|bottom
    // [5] = left|right
    // .. but 3..5 are useless as they're only the first match.
    var pat = new RegExp("^\s*([\\w.#][-\\w.#, ]+)[\\n\\s]*\\{([^}]+border-((top|bottom)-(left|right)-)?radius[^}]*)\\}", "mg");
    var matches;
    this.rules = [];
    while ((matches = pat.exec(txt)) !== null) {
        var pat2 = new RegExp("(..)border-((top|bottom)-(left|right)-)?radius:\\s*([\\d.]+)(in|em|px|ex|pt)", "g");
        var submatches, cornerspec = new curvyCnrSpec(matches[1]);
        while ((submatches = pat2.exec(matches[2])) !== null)
            if (submatches[1] !== "z-")
            cornerspec.setcorner(submatches[3], submatches[4], submatches[5], submatches[6]);
        this.rules.push(cornerspec);
    }
}
// static class function to determine if the sheet is worth parsing
operasheet.contains_border_radius = function(sheetnumber) {
    return /border-((top|bottom)-(left|right)-)?radius/.test(document.styleSheets.item(sheetnumber).ownerNode.text);
}

/*
Usage:

curvyCorners(settingsObj, "selectorStr");
curvyCorners(settingsObj, domObj1[, domObj2[, domObj3[, . . . [, domObjN]]]]);
selectorStr::= "<complexSelector>[, <complexSelector>]..."
complexSelector::= <selector>[ <selector]
selector::= "[<elementname>].classname" | "#id"
*/

function curvyCorners() {
    var i, j, boxCol, settings, startIndex;
    // Check parameters
    if (typeof arguments[0] !== "object") throw curvyCorners.newError("First parameter of curvyCorners() must be an object.");
    if (arguments[0] instanceof curvyCnrSpec) {
        settings = arguments[0];
        if (!settings.selectorText && typeof arguments[1] === 'string')
            settings.selectorText = arguments[1];
    }
    else {
        if (typeof arguments[1] !== "object" && typeof arguments[1] !== "string") throw curvyCorners.newError("Second parameter of curvyCorners() must be an object or a class name.");
        j = arguments[1];
        if (typeof j !== 'string') j = '';
        if (j !== '' && j.charAt(0) !== '.' && 'autoPad' in arguments[0]) j = '.' + j; // for compatibility, prefix with dot
        settings = new curvyCnrSpec(j);
        settings.setfrom(arguments[0]);
    }

    // Get object(s)
    if (settings.selectorText) {
        startIndex = 0;
        var args = settings.selectorText.replace(/\s+$/, '').split(/,\s*/); // handle comma-separated selector list
        boxCol = new Array;

        // converts div#mybox to #mybox
        function idof(str) {
            var ret = str.split('#');
            return (ret.length === 2 ? "#" : "") + ret.pop();
        }

        for (i = 0; i < args.length; ++i) {
            var arg = idof(args[i]);
            var argbits = arg.split(' ');
            switch (arg.charAt(0)) {
                case '#': // id
                    j = argbits.length === 1 ? arg : argbits[0];
                    j = document.getElementById(j.substr(1));
                    if (j === null)
                        curvyCorners.alert("No object with ID " + arg + " exists yet.\nCall curvyCorners(settings, obj) when it is created.");
                    else if (argbits.length === 1)
                        boxCol.push(j);
                    else
                        boxCol = boxCol.concat(curvyCorners.getElementsByClass(argbits[1], j));
                    break;
                default:
                    if (argbits.length === 1)
                        boxCol = boxCol.concat(curvyCorners.getElementsByClass(arg));
                    else {
                        var encloser = curvyCorners.getElementsByClass(argbits[0]);
                        for (j = 0; j < encloser.length; ++j) {
                            boxCol = boxCol.concat(curvyCorners.getElementsByClass(argbits[1], encloser));
                        }
                    }
                    //break;
            }
        }
    }
    else {
        // Get objects
        startIndex = 1;
        boxCol = arguments;
    }

    // Loop through each argument
    for (i = startIndex, j = boxCol.length; i < j; ++i) {
        if (boxCol[i] && (!('IEborderRadius' in boxCol[i].style) || boxCol[i].style.IEborderRadius != 'set')) {
            if (boxCol[i].className && boxCol[i].className.indexOf('curvyRedraw') !== -1) {
                if (typeof curvyCorners.redrawList === 'undefined') curvyCorners.redrawList = new Array;
                curvyCorners.redrawList.push({
                    node: boxCol[i],
                    spec: settings,
                    copy: boxCol[i].cloneNode(false)
                });
            }
            boxCol[i].style.IEborderRadius = 'set';
            var obj = new curvyObject(settings, boxCol[i]);
            obj.applyCorners();
        }
    }
}
curvyCorners.prototype.applyCornersToAll = function() { // now redundant
    curvyCorners.alert('This function is now redundant. Just call curvyCorners(). See documentation.');
};

curvyCorners.redraw = function() {
    if (!curvyBrowser.isOp && !curvyBrowser.isIE) return;
    if (!curvyCorners.redrawList) throw curvyCorners.newError('curvyCorners.redraw() has nothing to redraw.');
    var old_block_value = curvyCorners.bock_redraw;
    curvyCorners.block_redraw = true;
    for (var i in curvyCorners.redrawList) {
        if (isNaN(i)) continue; // in case of added prototype methods
        var o = curvyCorners.redrawList[i];
        if (!o.node.clientWidth) continue; // don't resize hidden boxes
        var newchild = o.copy.cloneNode(false);
        for (var contents = o.node.firstChild; contents != null; contents = contents.nextSibling)
            if (contents.className === 'autoPadDiv') break;
        if (!contents) {
            curvyCorners.alert('Couldn\'t find autoPad DIV');
            break;
        }
        o.node.parentNode.replaceChild(newchild, o.node);
        while (contents.firstChild) newchild.appendChild(contents.removeChild(contents.firstChild));
        o = new curvyObject(o.spec, o.node = newchild);
        o.applyCorners();
    }
    curvyCorners.block_redraw = old_block_value;
}
curvyCorners.adjust = function(obj, prop, newval) {
    if (curvyBrowser.isOp || curvyBrowser.isIE) {
        if (!curvyCorners.redrawList) throw curvyCorners.newError('curvyCorners.adjust() has nothing to adjust.');
        var i, j = curvyCorners.redrawList.length;
        for (i = 0; i < j; ++i) if (curvyCorners.redrawList[i].node === obj) break;
        if (i === j) throw curvyCorners.newError('Object not redrawable');
        obj = curvyCorners.redrawList[i].copy;
    }
    if (prop.indexOf('.') === -1)
        obj[prop] = newval;
    else eval('obj.' + prop + "='" + newval + "'");
}
curvyCorners.handleWinResize = function() {
    if (!curvyCorners.block_redraw) curvyCorners.redraw();
}
curvyCorners.setWinResize = function(onoff) {
    curvyCorners.block_redraw = !onoff;
}
curvyCorners.newError = function(errorMessage) {
    return new Error("curvyCorners Error:\n" + errorMessage)
}
curvyCorners.alert = function(errorMessage) {
	var curvyCornersVerbose = false; 
    if (typeof curvyCornersVerbose === 'undefined' || curvyCornersVerbose) alert(errorMessage);
}

// curvyCorners object (can be called directly)

function curvyObject() {
    var boxDisp;
    this.box = arguments[1];
    this.settings = arguments[0];
    this.topContainer = this.bottomContainer = this.shell = boxDisp = null;
    var boxWidth = this.box.clientWidth; // browser-independent IE-emulation (NB includes padding)

    // if no client width, maybe the box or a parent has 'display:none'.

    if (!boxWidth && curvyBrowser.isIE) {
        this.box.style.zoom = 1; // can force IE to calculate width
        boxWidth = this.box.clientWidth;
    }
    if (!boxWidth) {
        if (!this.box.parentNode) throw this.newError("box has no parent!"); // unlikely...
        for (boxDisp = this.box; ; boxDisp = boxDisp.parentNode) {
            if (!boxDisp || boxDisp.tagName === 'BODY') { // we've hit the buffers
                this.applyCorners = function() { } // make the error benign
                curvyCorners.alert(this.errmsg("zero-width box with no accountable parent", "warning"));
                return;
            }
            if (boxDisp.style.display === 'none') break;
        }
        // here, we've found the box whose display is set to 'none'.
        boxDisp.style.display = 'block'; // display in order to get browser to calculate clientWidth
        boxWidth = this.box.clientWidth;
    }
    if (arguments[0] instanceof curvyCnrSpec)
        this.spec = arguments[0].cloneOn(this.box); // convert non-pixel units
    else {
        this.spec = new curvyCnrSpec('');
        this.spec.setfrom(this.settings); // no need for unit conversion, use settings param. directly
    }

    // Get box formatting details
    var borderWidth = curvyBrowser.get_style(this.box, "borderTopWidth");
    var borderWidthB = curvyBrowser.get_style(this.box, "borderBottomWidth");
    var borderWidthL = curvyBrowser.get_style(this.box, "borderLeftWidth");
    var borderWidthR = curvyBrowser.get_style(this.box, "borderRightWidth");
    var borderColour = curvyBrowser.get_style(this.box, "borderTopColor");
    var borderColourB = curvyBrowser.get_style(this.box, "borderBottomColor");
    var borderColourL = curvyBrowser.get_style(this.box, "borderLeftColor");
    var boxColour = curvyBrowser.get_style(this.box, "backgroundColor");
    var backgroundImage = curvyBrowser.get_style(this.box, "backgroundImage");
    var backgroundRepeat = curvyBrowser.get_style(this.box, "backgroundRepeat");
    if (this.box.currentStyle && this.box.currentStyle.backgroundPositionX) {
        var backgroundPosX = curvyBrowser.get_style(this.box, "backgroundPositionX");
        var backgroundPosY = curvyBrowser.get_style(this.box, "backgroundPositionY");
    }
    else {
        var backgroundPosX = curvyBrowser.get_style(this.box, 'backgroundPosition');
        backgroundPosX = backgroundPosX.split(' ');
        var backgroundPosY = backgroundPosX[1];
        backgroundPosX = backgroundPosX[0];
    }
    var boxPosition = curvyBrowser.get_style(this.box, "position");
    var topPadding = curvyBrowser.get_style(this.box, "paddingTop");
    var bottomPadding = curvyBrowser.get_style(this.box, "paddingBottom");
    var leftPadding = curvyBrowser.get_style(this.box, "paddingLeft");
    var rightPadding = curvyBrowser.get_style(this.box, "paddingRight");
    var border = curvyBrowser.get_style(this.box, "border");
    filter = curvyBrowser.ieVer > 7 ? curvyBrowser.get_style(this.box, 'filter') : null; // IE8 bug fix

    var topMaxRadius = this.spec.get('tR');
    var botMaxRadius = this.spec.get('bR');
    var styleToNPx = function(val) {
        if (typeof val === 'number') return val;
        if (typeof val !== 'string') throw new Error('unexpected styleToNPx type ' + typeof val);
        var matches = /^[-\d.]([a-z]+)$/.exec(val);
        if (matches && matches[1] != 'px') throw new Error('Unexpected unit ' + matches[1]);
        if (isNaN(val = parseInt(val))) val = 0;
        return val;
    }
    var min0Px = function(val) {
        return val <= 0 ? "0" : val + "px";
    }

    // Set formatting properties
    try {
        this.borderWidth = styleToNPx(borderWidth);
        this.borderWidthB = styleToNPx(borderWidthB);
        this.borderWidthL = styleToNPx(borderWidthL);
        this.borderWidthR = styleToNPx(borderWidthR);
        this.boxColour = curvyObject.format_colour(boxColour);
        this.topPadding = styleToNPx(topPadding);
        this.bottomPadding = styleToNPx(bottomPadding);
        this.leftPadding = styleToNPx(leftPadding);
        this.rightPadding = styleToNPx(rightPadding);
        this.boxWidth = boxWidth;
        this.boxHeight = this.box.clientHeight;
        this.borderColour = curvyObject.format_colour(borderColour);
        this.borderColourB = curvyObject.format_colour(borderColourB);
        this.borderColourL = curvyObject.format_colour(borderColourL);
        this.borderString = this.borderWidth + "px" + " solid " + this.borderColour;
        this.borderStringB = this.borderWidthB + "px" + " solid " + this.borderColourB;
        this.backgroundImage = ((backgroundImage != "none") ? backgroundImage : "");
        this.backgroundRepeat = backgroundRepeat;
    }
    catch (e) {
        throw this.newError('getMessage' in e ? e.getMessage() : e.message);
    }
    var clientHeight = this.boxHeight;
    var clientWidth = boxWidth; // save it as it gets trampled on later
    if (curvyBrowser.isOp) {
        backgroundPosX = styleToNPx(backgroundPosX);
        backgroundPosY = styleToNPx(backgroundPosY);
        if (backgroundPosX) {
            var t = clientWidth + this.borderWidthL + this.borderWidthR;
            if (backgroundPosX > t) backgroundPosX = t;
            backgroundPosX = (t / backgroundPosX * 100) + '%'; // convert to percentage
        }
        if (backgroundPosY) {
            var t = clientHeight + this.borderWidth + this.borderWidthB;
            if (backgroundPosY > t) backgroundPosY = t;
            backgroundPosY = (t / backgroundPosY * 100) + '%'; // convert to percentage
        }
    }
    if (curvyBrowser.quirksMode) {
    }
    else {
        this.boxWidth -= this.leftPadding + this.rightPadding;
        this.boxHeight -= this.topPadding + this.bottomPadding;
    }

    // Create content container
    this.contentContainer = document.createElement("div");
    if (filter) this.contentContainer.style.filter = filter; // IE8 bug fix
    while (this.box.firstChild) this.contentContainer.appendChild(this.box.removeChild(this.box.firstChild));
    if ((boxPosition != "absolute") && (boxPosition != "fixed")) this.box.style.position = "relative";
    if (boxPosition != "absolute") this.box.style.position = "relative";
    this.box.style.padding = '0';
    this.box.style.border = this.box.style.backgroundImage = 'none';
    this.box.style.backgroundColor = 'transparent';

    this.box.style.width = (clientWidth + this.borderWidthL + this.borderWidthR) + 'px';
    this.box.style.height = (clientHeight + this.borderWidth + this.borderWidthB) + 'px';

    // Ok we add an inner div to actually put things into this will allow us to keep the height

    var newMainContainer = document.createElement("div");
    newMainContainer.style.position = "absolute";
    if (filter) newMainContainer.style.filter = filter; // IE8 bug fix
    if (curvyBrowser.quirksMode) {
        newMainContainer.style.width = (clientWidth + this.borderWidthL + this.borderWidthR) + 'px';
    } else {
        newMainContainer.style.width = clientWidth + 'px';
    }
    newMainContainer.style.height = min0Px(clientHeight + this.borderWidth + this.borderWidthB - topMaxRadius - botMaxRadius);
    newMainContainer.style.padding = "0";
    newMainContainer.style.top = topMaxRadius + "px";
    newMainContainer.style.left = "0";
    if (this.borderWidthL)
        newMainContainer.style.borderLeft = this.borderWidthL + "px solid " + this.borderColourL;
    if (this.borderWidth && !topMaxRadius)
        newMainContainer.style.borderTop = this.borderWidth + "px solid " + this.borderColour;
    if (this.borderWidthR)
        newMainContainer.style.borderRight = this.borderWidthR + "px solid " + this.borderColourL;
    if (this.borderWidthB && !botMaxRadius)
        newMainContainer.style.borderBottom = this.borderWidthB + "px solid " + this.borderColourB;
    newMainContainer.style.backgroundColor = boxColour;
    newMainContainer.style.backgroundImage = this.backgroundImage;
    newMainContainer.style.backgroundRepeat = this.backgroundRepeat;
    this.shell = this.box.appendChild(newMainContainer);

    boxWidth = curvyBrowser.get_style(this.shell, "width");
    if (boxWidth === "" || boxWidth === "auto" || boxWidth.indexOf("%") !== -1) throw this.newError('Shell width is ' + boxWidth);
    this.boxWidth = (boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1) ? parseInt(boxWidth) : this.shell.clientWidth;

    /*
    This method creates the corners and
    applies them to the div element.
    */
    this.applyCorners = function() {
        /*
        Set up background offsets. This may need to be delayed until
        the background image is loaded.
        */
        if (this.backgroundObject) {
            var bgOffset = function(style, imglen, boxlen) {
                if (style === 0) return 0;
                var retval;
                if (style === 'right' || style === 'bottom') return boxlen - imglen;
                if (style === 'center') return (boxlen - imglen) / 2;
                if (style.indexOf('%') > 0) return (boxlen - imglen) * 100 / parseInt(style);
                return styleToNPx(style);
            }
            this.backgroundPosX = bgOffset(backgroundPosX, this.backgroundObject.width, clientWidth);
            this.backgroundPosY = bgOffset(backgroundPosY, this.backgroundObject.height, clientHeight);
        }
        else if (this.backgroundImage) {
            this.backgroundPosX = styleToNPx(backgroundPosX);
            this.backgroundPosY = styleToNPx(backgroundPosY);
        }
        /*
        Create top and bottom containers.
        These will be used as a parent for the corners and bars.
        */
        // Build top bar only if a top corner is to be drawn
        if (topMaxRadius) {
            newMainContainer = document.createElement("div");
            newMainContainer.style.width = this.boxWidth + "px";
            newMainContainer.style.fontSize = "1px";
            newMainContainer.style.overflow = "hidden";
            newMainContainer.style.position = "absolute";
            newMainContainer.style.paddingLeft = this.borderWidth + "px";
            newMainContainer.style.paddingRight = this.borderWidth + "px";
            newMainContainer.style.height = topMaxRadius + "px";
            newMainContainer.style.top = -topMaxRadius + "px";
            newMainContainer.style.left = -this.borderWidthL + "px";
            this.topContainer = this.shell.appendChild(newMainContainer);
        }
        // Build bottom bar only if a bottom corner is to be drawn
        if (botMaxRadius) {
            var newMainContainer = document.createElement("div");
            newMainContainer.style.width = this.boxWidth + "px";
            newMainContainer.style.fontSize = "1px";
            newMainContainer.style.overflow = "hidden";
            newMainContainer.style.position = "absolute";
            newMainContainer.style.paddingLeft = this.borderWidthB + "px";
            newMainContainer.style.paddingRight = this.borderWidthB + "px";
            newMainContainer.style.height = botMaxRadius + "px";
            newMainContainer.style.bottom = -botMaxRadius + "px";
            newMainContainer.style.left = -this.borderWidthL + "px";
            this.bottomContainer = this.shell.appendChild(newMainContainer);
        }

        var corners = this.spec.cornerNames();  // array of available corners

        /*
        Loop for each corner
        */
        for (var i in corners) if (!isNaN(i)) {
            // Get current corner type from array
            var cc = corners[i];
            var specRadius = this.spec[cc + 'R'];
            // Has the user requested the currentCorner be round?
            // Code to apply correct color to top or bottom
            var bwidth, bcolor, borderRadius, borderWidthTB;
            if (cc == "tr" || cc == "tl") {
                bwidth = this.borderWidth;
                bcolor = this.borderColour;
                borderWidthTB = this.borderWidth;
            } else {
                bwidth = this.borderWidthB;
                bcolor = this.borderColourB;
                borderWidthTB = this.borderWidthB;
            }
            borderRadius = specRadius - borderWidthTB;
            var newCorner = document.createElement("div");
            newCorner.style.height = this.spec.get(cc + 'Ru');
            newCorner.style.width = this.spec.get(cc + 'Ru');
            newCorner.style.position = "absolute";
            newCorner.style.fontSize = "1px";
            newCorner.style.overflow = "hidden";
            // THE FOLLOWING BLOCK OF CODE CREATES A ROUNDED CORNER
            // ---------------------------------------------------- TOP
            var intx, inty, outsideColour;
            var trans = filter ? parseInt(/alpha\(opacity.(\d+)\)/.exec(filter)[1]) : 100; // IE8 bug fix
            // Cycle the x-axis
            for (intx = 0; intx < specRadius; ++intx) {
                // Calculate the value of y1 which identifies the pixels inside the border
                var y1 = (intx + 1 >= borderRadius) ? -1 : Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow(intx + 1, 2))) - 1;
                // Calculate y2 and y3 only if there is a border defined
                if (borderRadius != specRadius) {
                    var y2 = (intx >= borderRadius) ? -1 : Math.ceil(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow(intx, 2)));
                    var y3 = (intx + 1 >= specRadius) ? -1 : Math.floor(Math.sqrt(Math.pow(specRadius, 2) - Math.pow((intx + 1), 2))) - 1;
                }
                // Calculate y4
                var y4 = (intx >= specRadius) ? -1 : Math.ceil(Math.sqrt(Math.pow(specRadius, 2) - Math.pow(intx, 2)));
                // Draw bar on inside of the border with foreground colour
                if (y1 > -1) this.drawPixel(intx, 0, this.boxColour, trans, (y1 + 1), newCorner, true, specRadius);
                // Draw border/foreground antialiased pixels and border only if there is a border defined
                if (borderRadius != specRadius) {
                    // Cycle the y-axis
                    if (this.spec.antiAlias) {
                        for (inty = y1 + 1; inty < y2; ++inty) {
                            // For each of the pixels that need anti aliasing between the foreground and border colour draw single pixel divs
                            if (this.backgroundImage != "") {
                                var borderFract = curvyObject.pixelFraction(intx, inty, borderRadius) * 100;
                                this.drawPixel(intx, inty, bcolor, trans, 1, newCorner, borderFract >= 30, specRadius);
                            }
                            else if (this.boxColour !== 'transparent') {
                                var pixelcolour = curvyObject.BlendColour(this.boxColour, bcolor, curvyObject.pixelFraction(intx, inty, borderRadius));
                                this.drawPixel(intx, inty, pixelcolour, trans, 1, newCorner, false, specRadius);
                            }
                            else this.drawPixel(intx, inty, bcolor, trans >> 1, 1, newCorner, false, specRadius);
                        }
                        // Draw bar for the border
                        if (y3 >= y2) {
                            if (y2 == -1) y2 = 0;
                            this.drawPixel(intx, y2, bcolor, trans, (y3 - y2 + 1), newCorner, false, 0);
                        }
                        outsideColour = bcolor;  // Set the colour for the outside AA curve
                        inty = y3;               // start_pos - 1 for y-axis AA pixels
                    }
                    else { // no antiAlias
                        if (y3 > y1) { // NB condition was >=, changed to avoid zero-height divs
                            this.drawPixel(intx, (y1 + 1), bcolor, trans, (y3 - y1), newCorner, false, 0);
                        }
                    }
                }
                else {
                    outsideColour = this.boxColour;  // Set the colour for the outside curve
                    inty = y1;               // start_pos - 1 for y-axis AA pixels
                }
                // Draw aa pixels?
                if (this.spec.antiAlias) {
                    // Cycle the y-axis and draw the anti aliased pixels on the outside of the curve
                    while (++inty < y4) {
                        // For each of the pixels that need anti aliasing between the foreground/border colour & background draw single pixel divs
                        this.drawPixel(intx, inty, outsideColour, (curvyObject.pixelFraction(intx, inty, specRadius) * trans), 1, newCorner, borderWidthTB <= 0, specRadius);
                    }
                }
            }
            // END OF CORNER CREATION
            // ---------------------------------------------------- END

            /*
            Now we have a new corner we need to reposition all the pixels unless
            the current corner is the bottom right.
            */
            // Loop through all children (pixel bars)
            for (var t = 0, k = newCorner.childNodes.length; t < k; ++t) {
                // Get current pixel bar
                var pixelBar = newCorner.childNodes[t];
                // Get current top and left properties
                var pixelBarTop = parseInt(pixelBar.style.top);
                var pixelBarLeft = parseInt(pixelBar.style.left);
                var pixelBarHeight = parseInt(pixelBar.style.height);
                // Reposition pixels
                if (cc == "tl" || cc == "bl") {
                    pixelBar.style.left = (specRadius - pixelBarLeft - 1) + "px"; // Left
                }
                if (cc == "tr" || cc == "tl") {
                    pixelBar.style.top = (specRadius - pixelBarHeight - pixelBarTop) + "px"; // Top
                }
                pixelBar.style.backgroundRepeat = this.backgroundRepeat;

                if (this.backgroundImage) switch (cc) {
                    case "tr":
                        pixelBar.style.backgroundPosition = (this.backgroundPosX - this.borderWidthL + specRadius - clientWidth - pixelBarLeft) + "px " + (this.backgroundPosY + pixelBarHeight + pixelBarTop + this.borderWidth - specRadius) + "px";
                        break;
                    case "tl":
                        pixelBar.style.backgroundPosition = (this.backgroundPosX - specRadius + pixelBarLeft + this.borderWidthL) + "px " + (this.backgroundPosY - specRadius + pixelBarHeight + pixelBarTop + this.borderWidth) + "px";
                        break;
                    case "bl":
                        pixelBar.style.backgroundPosition = (this.backgroundPosX - specRadius + pixelBarLeft + 1 + this.borderWidthL) + "px " + (this.backgroundPosY - clientHeight - this.borderWidth + (curvyBrowser.quirksMode ? pixelBarTop : -pixelBarTop) + specRadius) + "px";
                        break;
                    case "br":
                        if (curvyBrowser.quirksMode) {
                            pixelBar.style.backgroundPosition = (this.backgroundPosX + this.borderWidthL - clientWidth + specRadius - pixelBarLeft) + "px " + (this.backgroundPosY - clientHeight - this.borderWidth + pixelBarTop + specRadius) + "px";
                        } else {
                            pixelBar.style.backgroundPosition = (this.backgroundPosX - this.borderWidthL - clientWidth + specRadius - pixelBarLeft) + "px " + (this.backgroundPosY - clientHeight - this.borderWidth + specRadius - pixelBarTop) + "px";
                        }
                        //break;
                }
            }

            // Position the container
            switch (cc) {
                case "tl":
                    newCorner.style.top = newCorner.style.left = "0";
                    this.topContainer.appendChild(newCorner);
                    break;
                case "tr":
                    newCorner.style.top = newCorner.style.right = "0";
                    this.topContainer.appendChild(newCorner);
                    break;
                case "bl":
                    newCorner.style.bottom = newCorner.style.left = "0";
                    this.bottomContainer.appendChild(newCorner);
                    break;
                case "br":
                    newCorner.style.bottom = newCorner.style.right = "0";
                    this.bottomContainer.appendChild(newCorner);
                    //break;
            }
        }

        /*
        The last thing to do is draw the rest of the filler DIVs.
        */

        // Find out which corner has the bigger radius and get the difference amount
        var radiusDiff = {
            t: this.spec.radiusdiff('t'),
            b: this.spec.radiusdiff('b')
        };

        for (z in radiusDiff) {
            if (typeof z === 'function') continue; // for prototype, mootools frameworks
            if (!this.spec.get(z + 'R')) continue; // no need if no corners
            if (radiusDiff[z]) {
                // check unsupported feature and warn if necessary
                if (this.backgroundImage && this.spec.radiusSum(z) !== radiusDiff[z])
                    curvyCorners.alert(this.errmsg('Not supported: unequal non-zero top/bottom radii with background image'));
                // Get the type of corner that is the smaller one
                var smallerCornerType = (this.spec[z + "lR"] < this.spec[z + "rR"]) ? z + "l" : z + "r";

                // First we need to create a DIV for the space under the smaller corner
                var newFiller = document.createElement("div");
                newFiller.style.height = radiusDiff[z] + "px";
                newFiller.style.width = this.spec.get(smallerCornerType + 'Ru');
                newFiller.style.position = "absolute";
                newFiller.style.fontSize = "1px";
                newFiller.style.overflow = "hidden";
                newFiller.style.backgroundColor = this.boxColour;

                // Position filler
                switch (smallerCornerType) {
                    case "tl":
                        newFiller.style.bottom =
            newFiller.style.left = "0";
                        newFiller.style.borderLeft = this.borderString;
                        this.topContainer.appendChild(newFiller);
                        break;
                    case "tr":
                        newFiller.style.bottom =
            newFiller.style.right = "0";
                        newFiller.style.borderRight = this.borderString;
                        this.topContainer.appendChild(newFiller);
                        break;
                    case "bl":
                        newFiller.style.top =
            newFiller.style.left = "0";
                        newFiller.style.borderLeft = this.borderStringB;
                        this.bottomContainer.appendChild(newFiller);
                        break;
                    case "br":
                        newFiller.style.top =
            newFiller.style.right = "0";
                        newFiller.style.borderRight = this.borderStringB;
                        this.bottomContainer.appendChild(newFiller);
                        //break;
                }
            }

            // Create the bar to fill the gap between each corner horizontally
            var newFillerBar = document.createElement("div");
            if (filter) newFillerBar.style.filter = filter; // IE8 bug fix
            newFillerBar.style.position = "relative";
            newFillerBar.style.fontSize = "1px";
            newFillerBar.style.overflow = "hidden";
            newFillerBar.style.width = this.fillerWidth(z);
            newFillerBar.style.backgroundColor = this.boxColour;
            newFillerBar.style.backgroundImage = this.backgroundImage;
            newFillerBar.style.backgroundRepeat = this.backgroundRepeat;

            switch (z) {
                case "t":
                    // Top Bar
                    if (this.topContainer) {
                        if (curvyBrowser.quirksMode) {
                            newFillerBar.style.height = 100 + topMaxRadius + "px";
                        } else {
                            newFillerBar.style.height = 100 + topMaxRadius - this.borderWidth + "px";
                        }
                        newFillerBar.style.marginLeft = this.spec.tlR ? (this.spec.tlR - this.borderWidthL) + "px" : "0";
                        newFillerBar.style.borderTop = this.borderString;
                        if (this.backgroundImage) {
                            var x_offset = this.spec.tlR ?
                (this.backgroundPosX - (topMaxRadius - this.borderWidthL)) + "px " : "0 ";
                            newFillerBar.style.backgroundPosition = x_offset + this.backgroundPosY + "px";
                            // Reposition the box's background image
                            this.shell.style.backgroundPosition = this.backgroundPosX + "px " + (this.backgroundPosY - topMaxRadius + this.borderWidthL) + "px";
                        }
                        this.topContainer.appendChild(newFillerBar);
                    }
                    break;
                case "b":
                    if (this.bottomContainer) {
                        // Bottom Bar
                        if (curvyBrowser.quirksMode) {
                            newFillerBar.style.height = botMaxRadius + "px";
                        } else {
                            newFillerBar.style.height = botMaxRadius - this.borderWidthB + "px";
                        }
                        newFillerBar.style.marginLeft = this.spec.blR ? (this.spec.blR - this.borderWidthL) + "px" : "0";
                        newFillerBar.style.borderBottom = this.borderStringB;
                        if (this.backgroundImage) {
                            var x_offset = this.spec.blR ?
                (this.backgroundPosX + this.borderWidthL - botMaxRadius) + "px " : this.backgroundPosX + "px ";
                            newFillerBar.style.backgroundPosition = x_offset + (this.backgroundPosY - clientHeight - this.borderWidth + botMaxRadius) + "px";
                        }
                        this.bottomContainer.appendChild(newFillerBar);
                    }
                    //break;
            }
        }

        // style content container
        this.contentContainer.style.position = "absolute";
        // contentContainer.style.border = "1px dotted #000"; // DEBUG, comment for production
        this.contentContainer.className = "autoPadDiv";
        this.contentContainer.style.left = this.borderWidthL + "px";
        // Get padding amounts
        // Apply top padding
        this.contentContainer.style.paddingTop = this.topPadding + "px";
        this.contentContainer.style.top = this.borderWidth + "px";
        // skip bottom padding - it doesn't show!
        // Apply left and right padding
        this.contentContainer.style.paddingLeft = this.leftPadding + "px";
        this.contentContainer.style.paddingRight = this.rightPadding + "px";
        z = clientWidth;
        if (!curvyBrowser.quirksMode) z -= this.leftPadding + this.rightPadding;
        this.contentContainer.style.width = z + "px";
        this.contentContainer.style.textAlign = curvyBrowser.get_style(this.box, 'textAlign');
        this.box.style.textAlign = 'left'; // important otherwise layout goes wild

        this.box.appendChild(this.contentContainer);
        if (boxDisp) boxDisp.style.display = 'none';
    }
    if (this.backgroundImage) {
        backgroundPosX = this.backgroundCheck(backgroundPosX);
        backgroundPosY = this.backgroundCheck(backgroundPosY);
        if (this.backgroundObject) {
            this.backgroundObject.holdingElement = this;
            this.dispatch = this.applyCorners;
            this.applyCorners = function() {
                if (this.backgroundObject.complete)
                    this.dispatch();
                else this.backgroundObject.onload = new Function('curvyObject.dispatch(this.holdingElement);');
            }
        }
    }
}

curvyObject.prototype.backgroundCheck = function(style) {
    if (style === 'top' || style === 'left' || parseInt(style) === 0) return 0;
    if (!(/^[-\d.]+px$/.test(style)) && !this.backgroundObject) {
        this.backgroundObject = new Image;
        var imgName = function(str) {
            var matches = /url\("?([^'"]+)"?\)/.exec(str);
            return (matches ? matches[1] : str);
        }
        this.backgroundObject.src = imgName(this.backgroundImage);
    }
    return style;
}

curvyObject.dispatch = function(obj) {
    if ('dispatch' in obj)
        obj.dispatch();
    else throw obj.newError('No dispatch function');
}

// append a pixel DIV to newCorner

curvyObject.prototype.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius) {
    var pixel = document.createElement("div");
    pixel.style.height = height + "px";
    pixel.style.width = "1px";
    pixel.style.position = "absolute";
    pixel.style.fontSize = "1px";
    pixel.style.overflow = "hidden";
    var topMaxRadius = this.spec.get('tR');
    pixel.style.backgroundColor = colour;
    // Don't apply background image to border pixels
    if (image && this.backgroundImage != "") {
        pixel.style.backgroundImage = this.backgroundImage;
        pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) - this.borderWidth) + "px";
    }
    // Set opacity if the transparency is anything other than 100
    if (transAmount != 100) curvyObject.setOpacity(pixel, transAmount);
    // Set position
    pixel.style.top = inty + "px";
    pixel.style.left = intx + "px";
    //pixel.nodeValue = ' ';
    newCorner.appendChild(pixel);
}

curvyObject.prototype.fillerWidth = function(tb) {
    var bWidth = curvyBrowser.quirksMode ? 0 : this.spec.radiusCount(tb) * this.borderWidthL;
    return (this.boxWidth - this.spec.radiusSum(tb) + bWidth) + 'px';
}

curvyObject.prototype.errmsg = function(msg, gravity) {
    var extradata = "\ntag: " + this.box.tagName;
    if (this.box.id) extradata += "\nid: " + this.box.id;
    if (this.box.className) extradata += "\nclass: " + this.box.className;
    var parent;
    if ((parent = this.box.parentNode) === null)
        extradata += "\n(box has no parent)";
    else {
        extradata += "\nParent tag: " + parent.tagName;
        if (parent.id) extradata += "\nParent ID: " + parent.id;
        if (parent.className) extradata += "\nParent class: " + parent.className;
    }
    if (gravity === undefined) gravity = 'warning';
    return 'curvyObject ' + gravity + ":\n" + msg + extradata;
}

curvyObject.prototype.newError = function(msg) {
    return new Error(this.errmsg(msg, 'exception'));
}

// ------------- UTILITY FUNCTIONS

//  Convert a number 0..255 to hex


curvyObject.IntToHex = function(strNum) {
    var hexdig = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];

    return hexdig[strNum >>> 4] + '' + hexdig[strNum & 15];
}

/*
Blends the two colours by the fraction
returns the resulting colour as a string in the format "#FFFFFF"
*/

curvyObject.BlendColour = function(Col1, Col2, Col1Fraction) {
    if (Col1 === 'transparent' || Col2 === 'transparent') throw this.newError('Cannot blend with transparent');
    if (Col1.charAt(0) !== '#') {
        //curvyCorners.alert('Found colour1 ' + Col1 + ': please let us know you saw this report.');
        Col1 = curvyObject.format_colour(Col1);
    }
    if (Col2.charAt(0) !== '#') {
        //curvyCorners.alert('Found colour2 ' + Col2 + ': please let us know you saw this report.');
        Col2 = curvyObject.format_colour(Col2);
    }
    var red1 = parseInt(Col1.substr(1, 2), 16);
    var green1 = parseInt(Col1.substr(3, 2), 16);
    var blue1 = parseInt(Col1.substr(5, 2), 16);
    var red2 = parseInt(Col2.substr(1, 2), 16);
    var green2 = parseInt(Col2.substr(3, 2), 16);
    var blue2 = parseInt(Col2.substr(5, 2), 16);

    if (Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1;

    var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction)));
    if (endRed > 255) endRed = 255;
    if (endRed < 0) endRed = 0;

    var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction)));
    if (endGreen > 255) endGreen = 255;
    if (endGreen < 0) endGreen = 0;

    var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction)));
    if (endBlue > 255) endBlue = 255;
    if (endBlue < 0) endBlue = 0;

    return "#" + curvyObject.IntToHex(endRed) + curvyObject.IntToHex(endGreen) + curvyObject.IntToHex(endBlue);
}

/*
For a pixel cut by the line determines the fraction of the pixel on the 'inside' of the
line.  Returns a number between 0 and 1
*/

curvyObject.pixelFraction = function(x, y, r) {
    var fraction;
    var rsquared = r * r;

    /*
    determine the co-ordinates of the two points on the perimeter of the pixel that the
    circle crosses
    */
    var xvalues = new Array(2);
    var yvalues = new Array(2);
    var point = 0;
    var whatsides = "";

    // x + 0 = Left
    var intersect = Math.sqrt(rsquared - Math.pow(x, 2));

    if (intersect >= y && intersect < (y + 1)) {
        whatsides = "Left";
        xvalues[point] = 0;
        yvalues[point] = intersect - y;
        ++point;
    }
    // y + 1 = Top
    intersect = Math.sqrt(rsquared - Math.pow(y + 1, 2));

    if (intersect >= x && intersect < (x + 1)) {
        whatsides += "Top";
        xvalues[point] = intersect - x;
        yvalues[point] = 1;
        ++point;
    }
    // x + 1 = Right
    intersect = Math.sqrt(rsquared - Math.pow(x + 1, 2));

    if (intersect >= y && intersect < (y + 1)) {
        whatsides += "Right";
        xvalues[point] = 1;
        yvalues[point] = intersect - y;
        ++point;
    }
    // y + 0 = Bottom
    intersect = Math.sqrt(rsquared - Math.pow(y, 2));

    if (intersect >= x && intersect < (x + 1)) {
        whatsides += "Bottom";
        xvalues[point] = intersect - x;
        yvalues[point] = 0;
    }

    /*
    depending on which sides of the perimeter of the pixel the circle crosses calculate the
    fraction of the pixel inside the circle
    */
    switch (whatsides) {
        case "LeftRight":
            fraction = Math.min(yvalues[0], yvalues[1]) + ((Math.max(yvalues[0], yvalues[1]) - Math.min(yvalues[0], yvalues[1])) / 2);
            break;

        case "TopRight":
            fraction = 1 - (((1 - xvalues[0]) * (1 - yvalues[1])) / 2);
            break;

        case "TopBottom":
            fraction = Math.min(xvalues[0], xvalues[1]) + ((Math.max(xvalues[0], xvalues[1]) - Math.min(xvalues[0], xvalues[1])) / 2);
            break;

        case "LeftBottom":
            fraction = yvalues[0] * xvalues[1] / 2;
            break;

        default:
            fraction = 1;
    }

    return fraction;
}

// Returns an array of rgb values

curvyObject.rgb2Array = function(rgbColour) {
    // Remove rgb()
    var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")"));

    // Split RGB into array
    return rgbValues.split(", ");
}

// This function converts CSS rgb(x, x, x) to hexadecimal

curvyObject.rgb2Hex = function(rgbColour) {
    try {
        // Get array of RGB values
        var rgbArray = curvyObject.rgb2Array(rgbColour);

        // Get RGB values
        var red = parseInt(rgbArray[0]);
        var green = parseInt(rgbArray[1]);
        var blue = parseInt(rgbArray[2]);

        // Build hex colour code
        var hexColour = "#" + curvyObject.IntToHex(red) + curvyObject.IntToHex(green) + curvyObject.IntToHex(blue);
    }
    catch (e) {
        var msg = 'getMessage' in e ? e.getMessage() : e.message;
        throw new Error("Error (" + msg + ") converting RGB value to Hex in rgb2Hex");
    }

    return hexColour;
}

/*
Function by Simon Willison from sitepoint.com
Modified by Cameron Cooke adding Safari's rgba support
*/

curvyObject.setOpacity = function(obj, opacity) {
    opacity = (opacity == 100) ? 99.999 : opacity;

    if (curvyBrowser.isSafari && obj.tagName != "IFRAME") {
        // Get array of RGB values
        var rgbArray = curvyObject.rgb2Array(obj.style.backgroundColor);

        // Get RGB values
        var red = parseInt(rgbArray[0]);
        var green = parseInt(rgbArray[1]);
        var blue = parseInt(rgbArray[2]);

        // Safari using RGBA support
        obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity / 100 + ")";
    }
    else if (typeof obj.style.opacity !== "undefined") { // W3C
        obj.style.opacity = opacity / 100;
    }
    else if (typeof obj.style.MozOpacity !== "undefined") { // Older Mozilla
        obj.style.MozOpacity = opacity / 100;
    }
    else if (typeof obj.style.filter != "undefined") { // IE
        obj.style.filter = "alpha(opacity=" + opacity + ")";
    }
    else if (typeof obj.style.KHTMLOpacity != "undefined") { // Older KHTML Based curvyBrowsers
        obj.style.KHTMLOpacity = opacity / 100;
    }
}


// Cross browser add event wrapper

function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
    }
    if (elm.attachEvent) return elm.attachEvent('on' + evType, fn);
    elm['on' + evType] = fn;
    return false;
}

// Gets the computed colour.
curvyObject.getComputedColour = function(colour) {
    var d = document.createElement('DIV');
    d.style.backgroundColor = colour;
    document.body.appendChild(d);

    if (window.getComputedStyle) { // Mozilla, Opera, Chrome, Safari
        var rtn = document.defaultView.getComputedStyle(d, null).getPropertyValue('background-color');
        d.parentNode.removeChild(d);
        if (rtn.substr(0, 3) === "rgb") rtn = curvyObject.rgb2Hex(rtn);
        return rtn;
    }
    else { // IE
        var rng = document.body.createTextRange();
        rng.moveToElementText(d);
        rng.execCommand('ForeColor', false, colour);
        var iClr = rng.queryCommandValue('ForeColor');
        var rgb = "rgb(" + (iClr & 0xFF) + ", " + ((iClr & 0xFF00) >> 8) + ", " + ((iClr & 0xFF0000) >> 16) + ")";
        d.parentNode.removeChild(d);
        rng = null;
        return curvyObject.rgb2Hex(rgb);
    }
}

// convert colour name, rgb() and #RGB to #RRGGBB
curvyObject.format_colour = function(colour) {
    // Make sure colour is set and not transparent
    if (colour != "" && colour != "transparent") {
        // RGB Value?
        if (colour.substr(0, 3) === "rgb") {
            // Get HEX aquiv.
            colour = curvyObject.rgb2Hex(colour);
        }
        else if (colour.charAt(0) !== '#') {
            // Convert colour name to hex value
            colour = curvyObject.getComputedColour(colour);
        }
        else if (colour.length === 4) {
            // 3 chr colour code add remainder
            colour = "#" + colour.charAt(1) + colour.charAt(1) + colour.charAt(2) + colour.charAt(2) + colour.charAt(3) + colour.charAt(3);
        }
    }
    return colour;
}

// Get elements by class by Dustin Diaz / CPKS
// NB if searchClass is a class name, it MUST be preceded by '.'

curvyCorners.getElementsByClass = function(searchClass, node) {
    var classElements = new Array;
    if (node === undefined) node = document;
    searchClass = searchClass.split('.'); // see if there's a tag in there
    var tag = 'div'; // prepare for no tag
    if (searchClass.length === 1) {
        tag = searchClass[0];
        searchClass = false;
    }
    else {
        if (searchClass[0]) tag = searchClass[0];
        searchClass = searchClass[1];
    }
    var i, els, elsLen;
    if (tag.charAt(0) === '#') {
        els = document.getElementById(tag.substr(1));
        if (els) classElements.push(els);
    }
    else {
        els = node.getElementsByTagName(tag);
        elsLen = els.length;
        if (searchClass) {
            var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
            for (i = 0; i < elsLen; ++i) {
                if (pattern.test(els[i].className)) classElements.push(els[i]);
            }
        }
        else for (i = 0; i < elsLen; ++i) classElements.push(els[i]);
    }
    return classElements;
}

if (curvyBrowser.isMoz || curvyBrowser.isWebKit)
    var curvyCornersNoAutoScan = true; // it won't do anything anyway.
else {

    // autoscan code

    curvyCorners.scanStyles = function() {
        function units(num) {
            var matches = /^[\d.]+(\w+)$/.exec(num);
            return matches[1];
        }
        var t, i, j;

        if (curvyBrowser.isIE) {
            function procIEStyles(rule) {
                var style = rule.style;

                if (curvyBrowser.ieVer > 6.0) {
                    var allR = style['-webkit-border-radius'] || 0;
                    var tR = style['-webkit-border-top-right-radius'] || 0;
                    var tL = style['-webkit-border-top-left-radius'] || 0;
                    var bR = style['-webkit-border-bottom-right-radius'] || 0;
                    var bL = style['-webkit-border-bottom-left-radius'] || 0;
                }
                else {
                    var allR = style['webkit-border-radius'] || 0;
                    var tR = style['webkit-border-top-right-radius'] || 0;
                    var tL = style['webkit-border-top-left-radius'] || 0;
                    var bR = style['webkit-border-bottom-right-radius'] || 0;
                    var bL = style['webkit-border-bottom-left-radius'] || 0;
                }
                if (allR || tL || tR || bR || bL) {
                    var settings = new curvyCnrSpec(rule.selectorText);
                    if (allR)
                        settings.setcorner(null, null, parseInt(allR), units(allR));
                    else {
                        if (tR) settings.setcorner('t', 'r', parseInt(tR), units(tR));
                        if (tL) settings.setcorner('t', 'l', parseInt(tL), units(tL));
                        if (bL) settings.setcorner('b', 'l', parseInt(bL), units(bL));
                        if (bR) settings.setcorner('b', 'r', parseInt(bR), units(bR));
                    }
                    curvyCorners(settings);
                }
            }
            for (t = 0; t < document.styleSheets.length; ++t) {
                if (document.styleSheets[t].imports) {
                    for (i = 0; i < document.styleSheets[t].imports.length; ++i)
                        for (j = 0; j < document.styleSheets[t].imports[i].rules.length; ++j)
                        procIEStyles(document.styleSheets[t].imports[i].rules[j]);
                }
                //for (i = 0; i < document.styleSheets[t].rules.length; ++i)
                    //procIEStyles(document.styleSheets[t].rules[i]);
            }
        }
        else if (curvyBrowser.isOp) {
            for (t = 0; t < document.styleSheets.length; ++t) {
                if (operasheet.contains_border_radius(t)) {
                    j = new operasheet(t);
                    for (i in j.rules) if (!isNaN(i))
                        curvyCorners(j.rules[i]);
                }
            }
        }
        else curvyCorners.alert('Scanstyles does nothing in Webkit/Firefox');
    };

    // Dean Edwards/Matthias Miller/John Resig

    curvyCorners.init = function() {
        // quit if this function has already been called
        if (arguments.callee.done) return;

        // flag this function so we don't do the same thing twice
        arguments.callee.done = true;

        // kill the timer
        if (curvyBrowser.isWebKit && curvyCorners.init.timer) {
            clearInterval(curvyCorners.init.timer);
            curvyCorners.init.timer = null;
        }

        // do stuff
        curvyCorners.scanStyles();
    };
}

if (typeof curvyCornersNoAutoScan === 'undefined' || curvyCornersNoAutoScan === false) {
    if (curvyBrowser.isOp)
        document.addEventListener("DOMContentLoaded", curvyCorners.init, false);
    else addEvent(window, 'load', curvyCorners.init, false);
}

