var DOKU_BASE   = '/';var DOKU_TPL    = '/lib/tpl/monobook/';var DOKU_UHN    = 0;var DOKU_UHC    = 0;LANG = {"searchmedia":"Search for files","keepopen":"Keep window open on selection","hidedetails":"Hide Details","nosmblinks":"Linking to Windows shares only works in Microsoft Internet Explorer.\nYou still can copy and paste the link.","linkwiz":"Link Wizard","linkto":"Link to:","del_confirm":"Really delete selected item(s)?","mu_btn":"Upload multiple files at once","plugins":[]};
var toolbar = [{"type":"format","title":"Bold Text","icon":"bold.png","key":"b","open":"**","close":"**"},{"type":"format","title":"Italic Text","icon":"italic.png","key":"i","open":"\/\/","close":"\/\/"},{"type":"format","title":"Underlined Text","icon":"underline.png","key":"u","open":"__","close":"__"},{"type":"format","title":"Code Text","icon":"mono.png","key":"c","open":"''","close":"''"},{"type":"format","title":"Strike-through Text","icon":"strike.png","key":"d","open":"<del>","close":"<\/del>"},{"type":"autohead","title":"Same Level Headline","icon":"hequal.png","key":"8","text":"Headline","mod":0},{"type":"autohead","title":"Lower Headline","icon":"hminus.png","key":"9","text":"Headline","mod":1},{"type":"autohead","title":"Higher Headline","icon":"hplus.png","key":"0","text":"Headline","mod":-1},{"type":"picker","title":"Select Headline","icon":"h.png","class":"pk_hl","list":[{"type":"format","title":"Level 1 Headline","icon":"h1.png","key":"1","open":"====== ","close":" ======\\n"},{"type":"format","title":"Level 2 Headline","icon":"h2.png","key":"2","open":"===== ","close":" =====\\n"},{"type":"format","title":"Level 3 Headline","icon":"h3.png","key":"3","open":"==== ","close":" ====\\n"},{"type":"format","title":"Level 4 Headline","icon":"h4.png","key":"4","open":"=== ","close":" ===\\n"},{"type":"format","title":"Level 5 Headline","icon":"h5.png","key":"5","open":"== ","close":" ==\\n"}]},{"type":"linkwiz","title":"Internal Link","icon":"link.png","key":"l","open":"[[","close":"]]"},{"type":"format","title":"External Link","icon":"linkextern.png","open":"[[","close":"]]","sample":"http:\/\/example.com|External Link"},{"type":"formatln","title":"Ordered List Item","icon":"ol.png","open":"  - ","close":"","key":"-"},{"type":"formatln","title":"Unordered List Item","icon":"ul.png","open":"  * ","close":"","key":"."},{"type":"insert","title":"Horizontal Rule","icon":"hr.png","insert":"\\n----\\n"},{"type":"mediapopup","title":"Add Images and other files","icon":"image.png","url":"lib\/exe\/mediamanager.php?ns=","name":"mediaselect","options":"width=750,height=500,left=20,top=20,scrollbars=yes,resizable=yes"},{"type":"picker","title":"Smileys","icon":"smiley.png","list":{"8-)":"icon_cool.gif","8-O":"icon_eek.gif","8-o":"icon_eek.gif",":-(":"icon_sad.gif",":-)":"icon_smile.gif","=)":"icon_smile2.gif",":-\/":"icon_doubt.gif",":-\\":"icon_doubt2.gif",":-?":"icon_confused.gif",":-D":"icon_biggrin.gif",":-P":"icon_razz.gif",":-o":"icon_surprised.gif",":-O":"icon_surprised.gif",":-x":"icon_silenced.gif",":-X":"icon_silenced.gif",":-|":"icon_neutral.gif",";-)":"icon_wink.gif","^_^":"icon_fun.gif",":?:":"icon_question.gif",":!:":"icon_exclaim.gif","LOL":"icon_lol.gif","FIXME":"fixme.gif","DELETEME":"delete.gif"},"icobase":"smileys"},{"type":"picker","title":"Special Chars","icon":"chars.png","list":["\u00c0","\u00e0","\u00c1","\u00e1","\u00c2","\u00e2","\u00c3","\u00e3","\u00c4","\u00e4","\u01cd","\u01ce","\u0102","\u0103","\u00c5","\u00e5","\u0100","\u0101","\u0104","\u0105","\u00c6","\u00e6","\u0106","\u0107","\u00c7","\u00e7","\u010c","\u010d","\u0108","\u0109","\u010a","\u010b","\u00d0","\u0111","\u00f0","\u010e","\u010f","\u00c8","\u00e8","\u00c9","\u00e9","\u00ca","\u00ea","\u00cb","\u00eb","\u011a","\u011b","\u0112","\u0113","\u0116","\u0117","\u0118","\u0119","\u0122","\u0123","\u011c","\u011d","\u011e","\u011f","\u0120","\u0121","\u0124","\u0125","\u00cc","\u00ec","\u00cd","\u00ed","\u00ce","\u00ee","\u00cf","\u00ef","\u01cf","\u01d0","\u012a","\u012b","\u0130","\u0131","\u012e","\u012f","\u0134","\u0135","\u0136","\u0137","\u0139","\u013a","\u013b","\u013c","\u013d","\u013e","\u0141","\u0142","\u013f","\u0140","\u0143","\u0144","\u00d1","\u00f1","\u0145","\u0146","\u0147","\u0148","\u00d2","\u00f2","\u00d3","\u00f3","\u00d4","\u00f4","\u00d5","\u00f5","\u00d6","\u00f6","\u01d1","\u01d2","\u014c","\u014d","\u0150","\u0151","\u0152","\u0153","\u00d8","\u00f8","\u0154","\u0155","\u0156","\u0157","\u0158","\u0159","\u015a","\u015b","\u015e","\u015f","\u0160","\u0161","\u015c","\u015d","\u0162","\u0163","\u0164","\u0165","\u00d9","\u00f9","\u00da","\u00fa","\u00db","\u00fb","\u00dc","\u00fc","\u01d3","\u01d4","\u016c","\u016d","\u016a","\u016b","\u016e","\u016f","\u01d6","\u01d8","\u01da","\u01dc","\u0172","\u0173","\u0170","\u0171","\u0174","\u0175","\u00dd","\u00fd","\u0178","\u00ff","\u0176","\u0177","\u0179","\u017a","\u017d","\u017e","\u017b","\u017c","\u00de","\u00fe","\u00df","\u0126","\u0127","\u00bf","\u00a1","\u00a2","\u00a3","\u00a4","\u00a5","\u20ac","\u00a6","\u00a7","\u00aa","\u00ac","\u00af","\u00b0","\u00b1","\u00f7","\u2030","\u00bc","\u00bd","\u00be","\u00b9","\u00b2","\u00b3","\u00b5","\u00b6","\u2020","\u2021","\u00b7","\u2022","\u00ba","\u2200","\u2202","\u2203","\u018f","\u0259","\u2205","\u2207","\u2208","\u2209","\u220b","\u220f","\u2211","\u203e","\u2212","\u2217","\u221a","\u221d","\u221e","\u2220","\u2227","\u2228","\u2229","\u222a","\u222b","\u2234","\u223c","\u2245","\u2248","\u2260","\u2261","\u2264","\u2265","\u2282","\u2283","\u2284","\u2286","\u2287","\u2295","\u2297","\u22a5","\u22c5","\u25ca","\u2118","\u2111","\u211c","\u2135","\u2660","\u2663","\u2665","\u2666","\u03b1","\u03b2","\u0393","\u03b3","\u0394","\u03b4","\u03b5","\u03b6","\u03b7","\u0398","\u03b8","\u03b9","\u03ba","\u039b","\u03bb","\u03bc","\u039e","\u03be","\u03a0","\u03c0","\u03c1","\u03a3","\u03c3","\u03a4","\u03c4","\u03c5","\u03a6","\u03c6","\u03c7","\u03a8","\u03c8","\u03a9","\u03c9","\u2605","\u2606","\u260e","\u261a","\u261b","\u261c","\u261d","\u261e","\u261f","\u2639","\u263a","\u2714","\u2718","\u00d7","\u201e","\u201c","\u201d","\u201a","\u2018","\u2019","\u00ab","\u00bb","\u2039","\u203a","\u2014","\u2013","\u2026","\u2190","\u2191","\u2192","\u2193","\u2194","\u21d0","\u21d1","\u21d2","\u21d3","\u21d4","\u00a9","\u2122","\u00ae","\u2032","\u2033","[","]","{","}","~","(",")","%","\u00a7","$","#","|","@"]},{"type":"signature","title":"Insert Signature","icon":"sig.png","key":"y"}];


/* XXXXXXXXXX begin of lib/scripts/helpers.js XXXXXXXXXX */

/**
 * Differrent helper functions
 *
 * @author Ilya Lebedev <ilya@lebedev.net>
 * @license LGPL
 */
//-----------------------------------------------------------------------------
//  Variable/property checks
//-----------------------------------------------------------------------------
/**
 *  Checks if property is undefined
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isUndefined (prop /* :Object */) /* :Boolean */ {
  return (typeof prop == 'undefined');
}
/**
 *  Checks if property is function
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isFunction (prop /* :Object */) /* :Boolean */ {
  return (typeof prop == 'function');
}
/**
 *  Checks if property is string
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isString (prop /* :Object */) /* :Boolean */ {
  return (typeof prop == 'string');
}
/**
 *  Checks if property is number
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isNumber (prop /* :Object */) /* :Boolean */ {
  return (typeof prop == 'number');
}
/**
 *  Checks if property is the calculable number
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isNumeric (prop /* :Object */) /* :Boolean */ {
  return isNumber(prop)&&!isNaN(prop)&&isFinite(prop);
}
/**
 *  Checks if property is array
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isArray (prop /* :Object */) /* :Boolean */ {
  return (prop instanceof Array);
}
/**
 *  Checks if property is regexp
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isRegExp (prop /* :Object */) /* :Boolean */ {
  return (prop instanceof RegExp);
}
/**
 *  Checks if property is a boolean value
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isBoolean (prop /* :Object */) /* :Boolean */ {
  return ('boolean' == typeof prop);
}
/**
 *  Checks if property is a scalar value (value that could be used as the hash key)
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isScalar (prop /* :Object */) /* :Boolean */ {
  return isNumeric(prop)||isString(prop);
}
/**
 *  Checks if property is empty
 *
 *  @param {Object} prop value to check
 *  @return {Boolean} true if matched
 *  @scope public
 */
function isEmpty (prop /* :Object */) /* :Boolean */ {
  if (isBoolean(prop)) return false;
  if (isRegExp(prop) && new RegExp("").toString() == prop.toString()) return true;
  if (isString(prop) || isNumber(prop)) return !prop;
  if (Boolean(prop)&&false != prop) {
    for (var i in prop) if(prop.hasOwnProperty(i)) return false
  }
  return true;
}

/**
 *  Checks if property is derived from prototype, applies method if it is not exists
 *
 *  @param string property name
 *  @return bool true if prototyped
 *  @access public
 */
if ('undefined' == typeof Object.hasOwnProperty) {
  Object.prototype.hasOwnProperty = function (prop) {
    return !('undefined' == typeof this[prop] || this.constructor && this.constructor.prototype[prop] && this[prop] === this.constructor.prototype[prop]);
  }
}

/**
 * Very simplistic Flash plugin check, probably works for Flash 8 and higher only
 */
function hasFlash(version){
    var ver = 0;
    try{
        if(navigator.plugins != null && navigator.plugins.length > 0){
           ver = navigator.plugins["Shockwave Flash"].description.split(' ')[2].split('.')[0];
        }else{
           var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
           ver = axo.GetVariable("$version").split(' ')[1].split(',')[0];
        }
    }catch(e){ }

    if(ver >= version) return true;
    return false;
}


/* XXXXXXXXXX end of lib/scripts/helpers.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/events.js XXXXXXXXXX */

// written by Dean Edwards, 2005
// with input from Tino Zijdel

// http://dean.edwards.name/weblog/2005/10/add-event/

function addEvent(element, type, handler) {
    // assign each event handler a unique ID
    if (!handler.$$guid) handler.$$guid = addEvent.guid++;
    // create a hash table of event types for the element
    if (!element.events) element.events = {};
    // create a hash table of event handlers for each element/event pair
    var handlers = element.events[type];
    if (!handlers) {
        handlers = element.events[type] = {};
        // store the existing event handler (if there is one)
        if (element["on" + type]) {
            handlers[0] = element["on" + type];
        }
    }
    // store the event handler in the hash table
    handlers[handler.$$guid] = handler;
    // assign a global event handler to do all the work
    element["on" + type] = handleEvent;
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
    // delete the event handler from the hash table
    if (element.events && element.events[type]) {
        delete element.events[type][handler.$$guid];
    }
};

function handleEvent(event) {
    var returnValue = true;
    // grab the event object (IE uses a global event object)
    event = event || fixEvent(window.event);
    // get a reference to the hash table of event handlers
    var handlers = this.events[event.type];
    // execute each event handler
    for (var i in handlers) {
        if (!handlers.hasOwnProperty(i)) continue;
        this.$$handleEvent = handlers[i];
        if (this.$$handleEvent(event) === false) {
            returnValue = false;
        }
    }
    return returnValue;
};

function fixEvent(event) {
    // add W3C standard event methods
    event.preventDefault = fixEvent.preventDefault;
    event.stopPropagation = fixEvent.stopPropagation;
    // fix target
    event.target = event.srcElement;
    return event;
};
fixEvent.preventDefault = function() {
    this.returnValue = false;
};
fixEvent.stopPropagation = function() {
    this.cancelBubble = true;
};


/**
 * Pseudo event handler to be fired after the DOM was parsed or
 * on window load at last.
 *
 * @author based upon some code by Dean Edwards
 * @author Dean Edwards
 * @link   http://dean.edwards.name/weblog/2006/06/again/
 */
window.fireoninit = 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 (_timer) {
     clearInterval(_timer);
     _timer = null;
  }

  if (typeof window.oninit == 'function') {
        window.oninit();
  }
};

/**
 * Run the fireoninit function as soon as possible after
 * the DOM was loaded, using different methods for different
 * Browsers
 *
 * @author Dean Edwards
 * @link   http://dean.edwards.name/weblog/2006/06/again/
 */
  // for Mozilla
  if (document.addEventListener) {
    document.addEventListener("DOMContentLoaded", window.fireoninit, null);
  }

  // for Internet Explorer (using conditional comments)
  /*@cc_on @*/
  /*@if (@_win32)
    document.write("<scr" + "ipt id=\"__ie_init\" defer=\"true\" src=\"//:\"><\/script>");
    var script = document.getElementById("__ie_init");
    script.onreadystatechange = function() {
        if (this.readyState == "complete") {
            window.fireoninit(); // call the onload handler
        }
    };
  /*@end @*/

  // for Safari
  if (/WebKit/i.test(navigator.userAgent)) { // sniff
    var _timer = setInterval(function() {
        if (/loaded|complete/.test(document.readyState)) {
            window.fireoninit(); // call the onload handler
        }
    }, 10);
  }

  // for other browsers
  window.onload = window.fireoninit;


/**
 * This is a pseudo Event that will be fired by the fireoninit
 * function above.
 *
 * Use addInitEvent to bind to this event!
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 * @see fireoninit()
 */
window.oninit = function(){};

/**
 * Bind a function to the window.init pseudo event
 *
 * @author Simon Willison
 * @see http://simon.incutio.com/archive/2004/05/26/addLoadEvent
 */
function addInitEvent(func) {
  var oldoninit = window.oninit;
  if (typeof window.oninit != 'function') {
    window.oninit = func;
  } else {
    window.oninit = function() {
      oldoninit();
      func();
    };
  }
}

/**
 * Bind variables to a function call creating a closure
 *
 * Use this to circumvent variable scope problems when creating closures
 * inside a loop
 *
 * @author  Adrian Lang <lang@cosmocode.de>
 * @link    http://www.cosmocode.de/en/blog/gohr/2009-10/15-javascript-fixing-the-closure-scope-in-loops
 * @param   functionref fnc - the function to be called
 * @param   mixed - any arguments to be passed to the function
 * @returns functionref
 */
function bind (fnc) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function() {
        return fnc.apply(this, args);
    }
}


/* XXXXXXXXXX end of lib/scripts/events.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/cookie.js XXXXXXXXXX */

/**
 * Handles the cookie used by several JavaScript functions
 *
 * Only a single cookie is written and read. You may only save
 * sime name-value pairs - no complex types!
 *
 * You should only use the getValue and setValue methods
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
DokuCookie = {
    data: Array(),
    name: 'DOKU_PREFS',

    /**
     * Save a value to the cookie
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    setValue: function(key,val){
        DokuCookie.init();
        DokuCookie.data[key] = val;

        // prepare expire date
        var now = new Date();
        DokuCookie.fixDate(now);
        now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); //expire in a year

        //save the whole data array
        var text = '';
        for(var key in DokuCookie.data){
            if (!DokuCookie.data.hasOwnProperty(key)) continue;
            text += '#'+escape(key)+'#'+DokuCookie.data[key];
        }
        DokuCookie.setCookie(DokuCookie.name,text.substr(1),now,DOKU_BASE);
    },

    /**
     * Get a Value from the Cookie
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    getValue: function(key){
        DokuCookie.init();
        return DokuCookie.data[key];
    },

    /**
     * Loads the current set cookie
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    init: function(){
        if(DokuCookie.data.length) return;
        var text  = DokuCookie.getCookie(DokuCookie.name);
        if(text){
            var parts = text.split('#');
            for(var i=0; i<parts.length; i+=2){
                DokuCookie.data[unescape(parts[i])] = unescape(parts[i+1]);
            }
        }
    },

    /**
     * This sets a cookie by JavaScript
     *
     * @link http://www.webreference.com/js/column8/functions.html
     */
    setCookie: function(name, value, expires, path, domain, secure) {
        var curCookie = name + "=" + escape(value) +
            ((expires) ? "; expires=" + expires.toGMTString() : "") +
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +
            ((secure) ? "; secure" : "");
        document.cookie = curCookie;
    },

    /**
     * This reads a cookie by JavaScript
     *
     * @link http://www.webreference.com/js/column8/functions.html
     */
    getCookie: function(name) {
        var dc = document.cookie;
        var prefix = name + "=";
        var begin = dc.indexOf("; " + prefix);
        if (begin == -1) {
            begin = dc.indexOf(prefix);
            if (begin !== 0){ return null; }
        } else {
            begin += 2;
        }
        var end = document.cookie.indexOf(";", begin);
        if (end == -1){
            end = dc.length;
        }
        return unescape(dc.substring(begin + prefix.length, end));
    },

    /**
     * This is needed for the cookie functions
     *
     * @link http://www.webreference.com/js/column8/functions.html
     */
    fixDate: function(date) {
        var base = new Date(0);
        var skew = base.getTime();
        if (skew > 0){
            date.setTime(date.getTime() - skew);
        }
    }
};


/* XXXXXXXXXX end of lib/scripts/cookie.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/script.js XXXXXXXXXX */

/**
 * Some of these scripts were taken from wikipedia.org and were modified for DokuWiki
 */

/**
 * Some browser detection
 */
var clientPC  = navigator.userAgent.toLowerCase(); // Get client info
var is_macos  = navigator.appVersion.indexOf('Mac') != -1;
var is_gecko  = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1) &&
                (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
var is_safari = ((clientPC.indexOf('AppleWebKit')!=-1) && (clientPC.indexOf('spoofer')==-1));
var is_khtml  = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
if (clientPC.indexOf('opera')!=-1) {
    var is_opera = true;
    var is_opera_preseven = (window.opera && !document.childNodes);
    var is_opera_seven = (window.opera && document.childNodes);
}

/**
 * Handy shortcut to document.getElementById
 *
 * This function was taken from the prototype library
 *
 * @link http://prototype.conio.net/
 */
function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1)
      return element;

    elements.push(element);
  }

  return elements;
}

/**
 * Simple function to check if a global var is defined
 *
 * @author Kae Verens
 * @link http://verens.com/archives/2005/07/25/isset-for-javascript/#comment-2835
 */
function isset(varname){
  return(typeof(window[varname])!='undefined');
}

/**
 * Select elements by their class name
 *
 * @author Dustin Diaz <dustin [at] dustindiaz [dot] com>
 * @link   http://www.dustindiaz.com/getelementsbyclass/
 */
function getElementsByClass(searchClass,node,tag) {
    var classElements = new Array();
    if ( node == null )
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (var i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
}

/**
 * Get the X offset of the top left corner of the given object
 *
 * @link http://www.quirksmode.org/index.html?/js/findpos.html
 */
function findPosX(object){
  var curleft = 0;
  var obj = $(object);
  if (obj.offsetParent){
    while (obj.offsetParent){
      curleft += obj.offsetLeft;
      obj = obj.offsetParent;
    }
  }
  else if (obj.x){
    curleft += obj.x;
  }
  return curleft;
} //end findPosX function

/**
 * Get the Y offset of the top left corner of the given object
 *
 * @link http://www.quirksmode.org/index.html?/js/findpos.html
 */
function findPosY(object){
  var curtop = 0;
  var obj = $(object);
  if (obj.offsetParent){
    while (obj.offsetParent){
      curtop += obj.offsetTop;
      obj = obj.offsetParent;
    }
  }
  else if (obj.y){
    curtop += obj.y;
  }
  return curtop;
} //end findPosY function

/**
 * Escape special chars in JavaScript
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function jsEscape(text){
    var re=new RegExp("\\\\","g");
    text=text.replace(re,"\\\\");
    re=new RegExp("'","g");
    text=text.replace(re,"\\'");
    re=new RegExp('"',"g");
    text=text.replace(re,'&quot;');
    re=new RegExp("\\\\\\\\n","g");
    text=text.replace(re,"\\n");
    return text;
}

/**
 * This function escapes some special chars
 * @deprecated by above function
 */
function escapeQuotes(text) {
  var re=new RegExp("'","g");
  text=text.replace(re,"\\'");
  re=new RegExp('"',"g");
  text=text.replace(re,'&quot;');
  re=new RegExp("\\n","g");
  text=text.replace(re,"\\n");
  return text;
}

/**
 * Adds a node as the first childenode to the given parent
 *
 * @see appendChild()
 */
function prependChild(parent,element) {
    if(!parent.firstChild){
        parent.appendChild(element);
    }else{
        parent.insertBefore(element,parent.firstChild);
    }
}

/**
 * Prints a animated gif to show the search is performed
 *
 * Because we need to modify the DOM here before the document is loaded
 * and parsed completely we have to rely on document.write()
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function showLoadBar(){

  document.write('<img src="'+DOKU_BASE+'lib/images/loading.gif" '+
                 'width="150" height="12" alt="..." />');

  /* this does not work reliable in IE
  obj = $(id);

  if(obj){
    obj.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" '+
                    'width="150" height="12" alt="..." />';
    obj.style.display="block";
  }
  */
}

/**
 * Disables the animated gif to show the search is done
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function hideLoadBar(id){
  obj = $(id);
  if(obj) obj.style.display="none";
}

/**
 * Adds the toggle switch to the TOC
 */
function addTocToggle() {
    if(!document.getElementById) return;
    var header = $('toc__header');
    if(!header) return;
    var toc = $('toc__inside');

    var obj          = document.createElement('span');
    obj.id           = 'toc__toggle';
    obj.style.cursor = 'pointer';
    if (toc && toc.style.display == 'none') {
        obj.innerHTML    = '<span>+</span>';
        obj.className    = 'toc_open';
    } else {
        obj.innerHTML    = '<span>&minus;</span>';
        obj.className    = 'toc_close';
    }

    prependChild(header,obj);
    obj.parentNode.onclick = toggleToc;
    try {
       obj.parentNode.style.cursor = 'pointer';
       obj.parentNode.style.cursor = 'hand';
    }catch(e){}
}

/**
 * This toggles the visibility of the Table of Contents
 */
function toggleToc() {
  var toc = $('toc__inside');
  var obj = $('toc__toggle');
  if(toc.style.display == 'none') {
    toc.style.display   = '';
    obj.innerHTML       = '<span>&minus;</span>';
    obj.className       = 'toc_close';
  } else {
    toc.style.display   = 'none';
    obj.innerHTML       = '<span>+</span>';
    obj.className       = 'toc_open';
  }
}

/**
 * Display an insitu footnote popup
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 * @author Chris Smith <chris@jalakai.co.uk>
 */
function footnote(e){
    var obj = e.target;
    var id = obj.id.substr(5);

    // get or create the footnote popup div
    var fndiv = $('insitu__fn');
    if(!fndiv){
        fndiv = document.createElement('div');
        fndiv.id        = 'insitu__fn';
        fndiv.className = 'insitu-footnote JSpopup dokuwiki';

        // autoclose on mouseout - ignoring bubbled up events
        addEvent(fndiv,'mouseout',function(e){
            if(e.target != fndiv){
                e.stopPropagation();
                return;
            }
            // check if the element was really left
            if(e.pageX){        // Mozilla
                var bx1 = findPosX(fndiv);
                var bx2 = bx1 + fndiv.offsetWidth;
                var by1 = findPosY(fndiv);
                var by2 = by1 + fndiv.offsetHeight;
                var x = e.pageX;
                var y = e.pageY;
                if(x > bx1 && x < bx2 && y > by1 && y < by2){
                    // we're still inside boundaries
                    e.stopPropagation();
                    return;
                }
            }else{              // IE
                if(e.offsetX > 0 && e.offsetX < fndiv.offsetWidth-1 &&
                   e.offsetY > 0 && e.offsetY < fndiv.offsetHeight-1){
                    // we're still inside boundaries
                    e.stopPropagation();
                    return;
                }
            }
            // okay, hide it
            fndiv.style.display='none';
        });
        document.body.appendChild(fndiv);
    }

    // locate the footnote anchor element
    var a = $( "fn__"+id );
    if (!a){ return; }

    // anchor parent is the footnote container, get its innerHTML
    var content = new String (a.parentNode.parentNode.innerHTML);

    // strip the leading content anchors and their comma separators
    content = content.replace(/<sup>.*<\/sup>/gi, '');
    content = content.replace(/^\s+(,\s+)+/,'');

    // prefix ids on any elements with "insitu__" to ensure they remain unique
    content = content.replace(/\bid=\"(.*?)\"/gi,'id="insitu__$1');

    // now put the content into the wrapper
    fndiv.innerHTML = content;

    // position the div and make it visible
    var x; var y;
    if(e.pageX){        // Mozilla
        x = e.pageX;
        y = e.pageY;
    }else{              // IE
        x = e.offsetX;
        y = e.offsetY;
    }
    fndiv.style.position = 'absolute';
    fndiv.style.left = (x+2)+'px';
    fndiv.style.top  = (y+2)+'px';
    fndiv.style.display = '';
}

/**
 * Add the event handlers to footnotes
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
addInitEvent(function(){
    var elems = getElementsByClass('fn_top',null,'a');
    for(var i=0; i<elems.length; i++){
        addEvent(elems[i],'mouseover',function(e){footnote(e);});
    }
});

/**
 * Add the edit window size controls
 */
function initSizeCtl(ctlid,edid){
    if(!document.getElementById){ return; }

    var ctl      = $(ctlid);
    var textarea = $(edid);
    if(!ctl || !textarea) return;

    var hgt = DokuCookie.getValue('sizeCtl');
    if(hgt){
      textarea.style.height = hgt;
    }else{
      textarea.style.height = '300px';
    }

    var wrp = DokuCookie.getValue('wrapCtl');
    if(wrp){
      setWrap(textarea, wrp);
    } // else use default value

    var l = document.createElement('img');
    var s = document.createElement('img');
    var w = document.createElement('img');
    l.src = DOKU_BASE+'lib/images/larger.gif';
    s.src = DOKU_BASE+'lib/images/smaller.gif';
    w.src = DOKU_BASE+'lib/images/wrap.gif';
    addEvent(l,'click',function(){sizeCtl(edid,100);});
    addEvent(s,'click',function(){sizeCtl(edid,-100);});
    addEvent(w,'click',function(){toggleWrap(edid);});
    ctl.appendChild(l);
    ctl.appendChild(s);
    ctl.appendChild(w);
}

/**
 * This sets the vertical size of the editbox
 */
function sizeCtl(edid,val){
  var textarea = $(edid);
  var height = parseInt(textarea.style.height.substr(0,textarea.style.height.length-2));
  height += val;
  textarea.style.height = height+'px';

  DokuCookie.setValue('sizeCtl',textarea.style.height);
}

/**
 * Toggle the wrapping mode of a textarea
 */
function toggleWrap(edid){
    var textarea = $(edid);
    var wrap = textarea.getAttribute('wrap');
    if(wrap && wrap.toLowerCase() == 'off'){
        setWrap(textarea, 'soft');
    }else{
        setWrap(textarea, 'off');
    }

    DokuCookie.setValue('wrapCtl',textarea.getAttribute('wrap'));
}

/**
 * Set the wrapping mode of a textarea
 *
 * @author Fluffy Convict <fluffyconvict@hotmail.com>
 * @author <shutdown@flashmail.com>
 * @link   http://news.hping.org/comp.lang.javascript.archive/12265.html
 * @link   https://bugzilla.mozilla.org/show_bug.cgi?id=41464
 */
function setWrap(textarea, wrapAttrValue){
    textarea.setAttribute('wrap', wrapAttrValue);

    // Fix display for mozilla
    var parNod = textarea.parentNode;
    var nxtSib = textarea.nextSibling;
    parNod.removeChild(textarea);
    parNod.insertBefore(textarea, nxtSib);
}

/**
 * Handler to close all open Popups
 */
function closePopups(){
  if(!document.getElementById){ return; }

  var divs = document.getElementsByTagName('div');
  for(var i=0; i < divs.length; i++){
    if(divs[i].className.indexOf('JSpopup') != -1){
            divs[i].style.display = 'none';
    }
  }
}

/**
 * Looks for an element with the ID scroll__here at scrolls to it
 */
function scrollToMarker(){
    var obj = $('scroll__here');
    if(obj) obj.scrollIntoView();
}

/**
 * Looks for an element with the ID focus__this at sets focus to it
 */
function focusMarker(){
    var obj = $('focus__this');
    if(obj) obj.focus();
}

/**
 * Remove messages
 */
function cleanMsgArea(){
    var elems = getElementsByClass('(success|info|error)',document,'div');
    if(elems){
        for(var i=0; i<elems.length; i++){
            elems[i].style.display = 'none';
        }
    }
}

/**
 * disable multiple revisions checkboxes if two are checked
 *
 * @author Anika Henke <anika@selfthinker.org>
 */
addInitEvent(function(){
    var revForm = $('page__revisions');
    if (!revForm) return;
    var elems = revForm.elements;
    var countTicks = 0;
    for (var i=0; i<elems.length; i++) {
        var input1 = elems[i];
        if (input1.type=='checkbox') {
            addEvent(input1,'click',function(e){
                if (this.checked) countTicks++;
                else countTicks--;
                for (var j=0; j<elems.length; j++) {
                    var input2 = elems[j];
                    if (countTicks >= 2) input2.disabled = (input2.type=='checkbox' && !input2.checked);
                    else input2.disabled = (input2.type!='checkbox');
                }
            });
            input1.checked = false; // chrome reselects on back button which messes up the logic
        } else if(input1.type=='submit'){
            input1.disabled = true;
        }
    }
});

/**
 * Add the event handler to the actiondropdown
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
addInitEvent(function(){
    var selector = $('action__selector');
    if(!selector) return;

    addEvent(selector,'change',function(e){
        this.form.submit();
    });

    $('action__selectorbtn').style.display = 'none';
});

/**
 * Display error for Windows Shares on browsers other than IE
 *
 * @author Michael Klier <chi@chimeric.de>
 */
function checkWindowsShares() {
    if(!LANG['nosmblinks']) return true;
    var elems = getElementsByClass('windows',document,'a');
    if(elems){
        for(var i=0; i<elems.length; i++){
            var share = elems[i];
            addEvent(share,'click',function(){
                if(document.all == null) {
                    alert(LANG['nosmblinks']);
                }
            });
        }
    }
}

/**
 * Add the event handler for the Windows Shares check
 *
 * @author Michael Klier <chi@chimeric.de>
 */
addInitEvent(function(){
    checkWindowsShares();
});

/**
 * Highlight the section when hovering over the appropriate section edit button
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
addInitEvent(function(){
    var break_classes = new RegExp('secedit|toc|page');
    var btns = getElementsByClass('btn_secedit',document,'form');
    for(var i=0; i<btns.length; i++){
        addEvent(btns[i],'mouseover',function(e){
            var tgt = e.target;
            if(tgt.form) tgt = tgt.form;
            tgt = tgt.parentNode.previousSibling;
            if(tgt.nodeName != "DIV") tgt = tgt.previousSibling;
            while(!break_classes.test(tgt.className)) {
                tgt.className += ' section_highlight';
                if (tgt.tagName == 'H1') break;
                tgt = (tgt.previousSibling != null) ? tgt.previousSibling : tgt.parentNode;
            }
        });

        addEvent(btns[i],'mouseout',function(e){
            var secs = getElementsByClass('section_highlight');
            for(var j=0; j<secs.length; j++){
                secs[j].className = secs[j].className.replace(/section_highlight/,'');
            }
            var secs = getElementsByClass('section_highlight');
        });
    }
});


/* XXXXXXXXXX end of lib/scripts/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/tw-sack.js XXXXXXXXXX */

/* Simple AJAX Code-Kit (SACK) */
/* ©2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence, see documentation or authors website for more details */

function sack(file){
  this.AjaxFailedAlert = "Your browser does not support the enhanced functionality of this website, and therefore you will have an experience that differs from the intended one.\n";
  this.requestFile = file;
  this.method = "POST";
  this.URLString = "";
  this.encodeURIString = true;
  this.execute = false;

  this.onLoading = function() { };
  this.onLoaded = function() { };
  this.onInteractive = function() { };
  this.onCompletion = function() { };
  this.afterCompletion = function() { };

  this.createAJAX = function() {
    try {
      this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (err) {
        this.xmlhttp = null;
      }
    }
    if(!this.xmlhttp && typeof XMLHttpRequest != "undefined"){
      this.xmlhttp = new XMLHttpRequest();
    }
    if (!this.xmlhttp){
      this.failed = true;
    }
  };

  this.setVar = function(name, value){
    if (this.URLString.length < 3){
      this.URLString = name + "=" + value;
    } else {
      this.URLString += "&" + name + "=" + value;
    }
  };

  this.encVar = function(name, value){
    var varString = encodeURIComponent(name) + "=" + encodeURIComponent(value);
  return varString;
  };

  this.encodeURLString = function(string){
    varArray = string.split('&');
    for (i = 0; i < varArray.length; i++){
      urlVars = varArray[i].split('=');
      if (urlVars[0].indexOf('amp;') != -1){
        urlVars[0] = urlVars[0].substring(4);
      }
      varArray[i] = this.encVar(urlVars[0],urlVars[1]);
    }
  return varArray.join('&');
  };

  this.runResponse = function(){
    eval(this.response);
  };

  this.runAJAX = function(urlstring){
    this.responseStatus = new Array(2);
    if(this.failed && this.AjaxFailedAlert){
      alert(this.AjaxFailedAlert);
    } else {
      if (urlstring){
        if (this.URLString.length){
          this.URLString = this.URLString + "&" + urlstring;
        } else {
          this.URLString = urlstring;
        }
      }
      if (this.encodeURIString){
        var timeval = new Date().getTime();
        this.URLString = this.encodeURLString(this.URLString);
        this.setVar("rndval", timeval);
      }
      if (this.element) { this.elementObj = document.getElementById(this.element); }
      if (this.xmlhttp) {
        var self = this;
        if (this.method == "GET") {
          var totalurlstring = this.requestFile + "?" + this.URLString;
          this.xmlhttp.open(this.method, totalurlstring, true);
        } else {
          this.xmlhttp.open(this.method, this.requestFile, true);
        }
        if (this.method == "POST"){
          try {
             this.xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
          } catch (e) {}
        }

        this.xmlhttp.onreadystatechange = function() {
          switch (self.xmlhttp.readyState){
            case 1:
              self.onLoading();
            break;
            case 2:
              self.onLoaded();
            break;
            case 3:
              self.onInteractive();
            break;
            case 4:
              self.response = self.xmlhttp.responseText;
              self.responseXML = self.xmlhttp.responseXML;
              self.responseStatus[0] = self.xmlhttp.status;
              self.responseStatus[1] = self.xmlhttp.statusText;
              self.onCompletion();
              if(self.execute){ self.runResponse(); }
              if (self.elementObj) {
                var elemNodeName = self.elementObj.nodeName;
                elemNodeName.toLowerCase();
                if (elemNodeName == "input" || elemNodeName == "select" || elemNodeName == "option" || elemNodeName == "textarea"){
                  self.elementObj.value = self.response;
                } else {
                  self.elementObj.innerHTML = self.response;
                }
              }
              self.afterCompletion();
              self.URLString = "";
            break;
          }
        };
        this.xmlhttp.send(this.URLString);
      }
    }
  };
this.createAJAX();
}


/* XXXXXXXXXX end of lib/scripts/tw-sack.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/ajax.js XXXXXXXXXX */

/**
 * AJAX functions for the pagename quicksearch
 *
 * We're using a global object with self referencing methods
 * here to make callbacks work
 *
 * @license  GPL2 (http://www.gnu.org/licenses/gpl.html)
 * @author   Andreas Gohr <andi@splitbrain.org>
 */

//prepare class
function ajax_qsearch_class(){
  this.sack = null;
  this.inObj = null;
  this.outObj = null;
  this.timer = null;
}

//create global object and add functions
var ajax_qsearch = new ajax_qsearch_class();
ajax_qsearch.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php');
ajax_qsearch.sack.AjaxFailedAlert = '';
ajax_qsearch.sack.encodeURIString = false;

ajax_qsearch.init = function(inID,outID){
  ajax_qsearch.inObj  = document.getElementById(inID);
  ajax_qsearch.outObj = document.getElementById(outID);

  // objects found?
  if(ajax_qsearch.inObj === null){ return; }
  if(ajax_qsearch.outObj === null){ return; }

  // attach eventhandler to search field
  addEvent(ajax_qsearch.inObj,'keyup',ajax_qsearch.call);

  // attach eventhandler to output field
  addEvent(ajax_qsearch.outObj,'click',function(){ ajax_qsearch.outObj.style.display='none'; });
};

ajax_qsearch.clear = function(){
  ajax_qsearch.outObj.style.display = 'none';
  ajax_qsearch.outObj.innerHTML = '';
  if(ajax_qsearch.timer !== null){
    window.clearTimeout(ajax_qsearch.timer);
    ajax_qsearch.timer = null;
  }
};

ajax_qsearch.exec = function(){
  ajax_qsearch.clear();
  var value = ajax_qsearch.inObj.value;
  if(value === ''){ return; }
  ajax_qsearch.sack.runAJAX('call=qsearch&q='+encodeURI(value));
};

ajax_qsearch.sack.onCompletion = function(){
  var data = ajax_qsearch.sack.response;
  if(data === ''){ return; }

  ajax_qsearch.outObj.innerHTML = data;
  ajax_qsearch.outObj.style.display = 'block';
};

ajax_qsearch.call = function(){
  ajax_qsearch.clear();
  ajax_qsearch.timer = window.setTimeout("ajax_qsearch.exec()",500);
};



/* XXXXXXXXXX end of lib/scripts/ajax.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/index.js XXXXXXXXXX */

/**
 * Javascript for index view
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */

var index = {

     /**
     * Delay in ms before showing the throbber.
     * Used to skip the throbber for fast AJAX calls.
     */
    throbber_delay: 500,

    /**
     * Attach event handlers to all "folders" below the given element
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    treeattach: function(obj){
        if(!obj) return;

        var items = getElementsByClass('idx_dir',obj,'a');
        for(var i=0; i<items.length; i++){
            var elem = items[i];

            // attach action to make the link clickable by AJAX
            addEvent(elem,'click',function(e){ return index.toggle(e,this); });

            // get the listitem the elem belongs to
            var listitem = elem.parentNode;
            while (listitem.tagName != 'LI') {
              listitem = listitem.parentNode;
            }
            //when there are uls under this listitem mark this listitem as opened
            if (listitem.getElementsByTagName('ul').length) {
              listitem.open = true;
            }
        }
    },

    /**
     * Open or close a subtree using AJAX
     * The contents of subtrees are "cached" untill the page is reloaded.
     * A "loading" indicator is shown only when the AJAX call is slow.
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     * @author Ben Coburn <btcoburn@silicodon.net>
     */
    toggle: function(e,clicky){
        var listitem = clicky.parentNode.parentNode;

        listitem.open = !listitem.open;
        // listitem.open represents now the action to be done

        // if already open, close by removing the sublist
        var sublists = listitem.getElementsByTagName('ul');
        if(!listitem.open){
            if (sublists.length) {
              sublists[0].style.display='none';
            }
            listitem.className='closed';
            e.preventDefault();
            return false;
        }

        // just show if already loaded
        if(sublists.length && listitem.open){
            sublists[0].style.display='';
            listitem.className='open';
            e.preventDefault();
            return false;
        }

        // prepare an AJAX call to fetch the subtree
        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        //prepare the new ul
        var ul = document.createElement('ul');
        ul.className = 'idx';
        timeout = window.setTimeout(function(){
            // show the throbber as needed
            if (listitem.open) {
              ul.innerHTML = '<li><img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="loading..." title="loading..." /></li>';
              listitem.appendChild(ul);
              listitem.className='open';
            }
        }, this.throbber_delay);
        ajax.elementObj = ul;
        ajax.afterCompletion = function(){
            window.clearTimeout(timeout);
            index.treeattach(ul);
            if (listitem.className!='open') {
              if (!listitem.open) {
                ul.style.display='none';
              }
              listitem.appendChild(ul);
              if (listitem.open) {
                listitem.className='open';
              }
            }
        };
        ajax.runAJAX(clicky.search.substr(1)+'&call=index');
        e.preventDefault();
        return false;
    }
};


addInitEvent(function(){
    index.treeattach($('index__tree'));
});


/* XXXXXXXXXX end of lib/scripts/index.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/drag.js XXXXXXXXXX */

/**
 * Makes a DOM object draggable
 *
 * This is currently for movable DOM dialogs only. If needed it could be
 * extended to execute callbacks on special events...
 *
 * @link http://nofunc.org/Drag_Drop/
 */
var drag = {
    obj: null,
    handle: null,
    oX: 0,  // object X position
    oY: 0,  // object Y position
    eX: 0,  // event X delta
    eY: 0,  // event Y delta

    /**
     * Attaches the needed handlers to the given object
     *
     * This can be called for multiple objects, the right one is later
     * determined from the event itself. The handle is optional
     *
     * @param DOMObject obj    The object that should be draggable
     * @param DOMObject handle A handle on which the obj can be dragged
     */
    attach: function (obj,handle) {
        if(handle){
            handle.dragobject = obj;
            addEvent($(handle),'mousedown',drag.start);
        }else{
            addEvent($(obj),'mousedown',drag.start);
        }
    },

    /**
     * Starts the dragging operation
     */
    start: function (e){
        drag.handle = e.target;
        if(drag.handle.dragobject){
            drag.obj = drag.handle.dragobject;
        }else{
            drag.obj = drag.handle;
        }

        drag.handle.className += ' ondrag';
        drag.obj.className    += ' ondrag';

        drag.oX = parseInt(drag.obj.style.left);
        drag.oY = parseInt(drag.obj.style.top);
        drag.eX = drag.evX(e);
        drag.eY = drag.evY(e);

        addEvent(document,'mousemove',drag.drag);
        addEvent(document,'mouseup',drag.stop);

        e.preventDefault();
        e.stopPropagation();
        return false;
    },

    /**
     * Ends the dragging operation
     */
    stop: function(){
        drag.handle.className = drag.handle.className.replace(/ ?ondrag/,'');
        drag.obj.className    = drag.obj.className.replace(/ ?ondrag/,'');
        removeEvent(document,'mousemove',drag.drag);
        removeEvent(document,'mouseup',drag.stop);
        drag.obj = null;
        drag.handle = null;
    },

    /**
     * Moves the object during the dragging operation
     */
    drag: function(e) {
        if(drag.obj) {
            drag.obj.style.top  = (drag.evY(e)+drag.oY-drag.eY+'px');
            drag.obj.style.left = (drag.evX(e)+drag.oX-drag.eX+'px');
        }
    },

    /**
     * Returns the X position of the given event.
     */
    evX: function(e){
        return (e.pageX) ? e.pageX : e.clientX + document.body.scrollTop; //fixme shouldn't this be scrollLeft?
    },

    /**
     * Returns the Y position of the given event.
     */
    evY: function(e){
        return (e.pageY) ? e.pageY : e.clientY + document.body.scrollTop;
    }

};



/* XXXXXXXXXX end of lib/scripts/drag.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/textselection.js XXXXXXXXXX */

/**
 * Text selection related functions.
 */

/**
 * selection prototype
 *
 * Object that capsulates the selection in a textarea. Returned by getSelection.
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function selection_class(){
    this.start     = 0;
    this.end       = 0;
    this.obj       = null;
    this.rangeCopy = null;
    this.scroll    = 0;
    this.fix       = 0;

    this.getLength = function(){
        return this.end - this.start;
    };

    this.getText = function(){
        if(!this.obj) return '';
        return this.obj.value.substring(this.start,this.end);
    }
}

/**
 * Get current selection/cursor position in a given textArea
 *
 * @link   http://groups.drupal.org/node/1210
 * @author Andreas Gohr <andi@splitbrain.org>
 * @link   http://linebyline.blogspot.com/2006/11/textarea-cursor-position-in-internet.html
 * @returns object - a selection object
 */
function getSelection(textArea) {
    var sel = new selection_class();

    sel.obj   = textArea;
    sel.start = textArea.value.length;
    sel.end   = textArea.value.length;

    textArea.focus();
    if(document.getSelection) {          // Mozilla et al.
        sel.start  = textArea.selectionStart;
        sel.end    = textArea.selectionEnd;
        sel.scroll = textArea.scrollTop;
    } else if(document.selection) {      // MSIE
        /*
         * This huge lump of code is neccessary to work around two MSIE bugs:
         *
         * 1. Selections trim newlines at the end of the code
         * 2. Selections count newlines as two characters
         */

        // The current selection
        sel.rangeCopy = document.selection.createRange().duplicate();

        var before_range = document.body.createTextRange();
        before_range.moveToElementText(textArea);                    // Selects all the text
        before_range.setEndPoint("EndToStart", sel.rangeCopy);     // Moves the end where we need it

        var before_finished = false, selection_finished = false;
        var before_text, selection_text;
        // Load the text values we need to compare
        before_text  = before_range.text;
        selection_text = sel.rangeCopy.text;

        sel.start = before_text.length;
        sel.end   = sel.start + selection_text.length;

        // Check each range for trimmed newlines by shrinking the range by 1 character and seeing
        // if the text property has changed.  If it has not changed then we know that IE has trimmed
        // a \r\n from the end.
        do {
            if (!before_finished) {
                if (before_range.compareEndPoints("StartToEnd", before_range) == 0) {
                    before_finished = true;
                } else {
                    before_range.moveEnd("character", -1);
                    if (before_range.text == before_text) {
                        sel.start += 2;
                        sel.end += 2;
                    } else {
                        before_finished = true;
                    }
                }
            }
            if (!selection_finished) {
                if (sel.rangeCopy.compareEndPoints("StartToEnd", sel.rangeCopy) == 0) {
                    selection_finished = true;
                } else {
                    sel.rangeCopy.moveEnd("character", -1);
                    if (sel.rangeCopy.text == selection_text) {
                        sel.end += 2;
                    } else {
                        selection_finished = true;
                    }
                }
            }
        } while ((!before_finished || !selection_finished));


        // count number of newlines in str to work around stupid IE selection bug
        var countNL = function(str) {
            var m = str.split("\r\n");
            if (!m || !m.length) return 0;
            return m.length-1;
        };
        sel.fix = countNL(sel.obj.value.substring(0,sel.start));

    }
    return sel;
}

/**
 * Set the selection
 *
 * You need to get a selection object via getSelection() first, then modify the
 * start and end properties and pass it back to this function.
 *
 * @link http://groups.drupal.org/node/1210
 * @author Andreas Gohr <andi@splitbrain.org>
 * @param object selection - a selection object as returned by getSelection()
 */
function setSelection(selection){
    if(document.getSelection){ // FF
        // what a pleasure in FF ;)
        selection.obj.setSelectionRange(selection.start,selection.end);
        if(selection.scroll) selection.obj.scrollTop = selection.scroll;
    } else if(document.selection) { // IE
        selection.rangeCopy.collapse(true);
        selection.rangeCopy.moveStart('character',selection.start - selection.fix);
        selection.rangeCopy.moveEnd('character',selection.end - selection.start);
        selection.rangeCopy.select();
    }
}

/**
 * Inserts the given text at the current cursor position or replaces the current
 * selection
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 * @param string text          - the new text to be pasted
 * @param objct  selecttion    - selection object returned by getSelection
 * @param int    opts.startofs - number of charcters at the start to skip from new selection
 * @param int    opts.endofs   - number of characters at the end to skip from new selection
 * @param bool   opts.nosel    - set true if new text should not be selected
 */
function pasteText(selection,text,opts){
    if(!opts) opts = {};
    // replace the content

    selection.obj.value =
        selection.obj.value.substring(0, selection.start) + text +
        selection.obj.value.substring(selection.end, selection.obj.value.length);

    // set new selection
    selection.end = selection.start + text.length;

    // modify the new selection if wanted
    if(opts.startofs) selection.start += opts.startofs;
    if(opts.endofs)   selection.end   -= opts.endofs;

    // no selection wanted? set cursor to end position
    if(opts.nosel) selection.start = selection.end;

    setSelection(selection);
}


/**
 * Format selection
 *
 * Apply tagOpen/tagClose to selection in textarea, use sampleText instead
 * of selection if there is none.
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function insertTags(textAreaID, tagOpen, tagClose, sampleText){
    var txtarea = $(textAreaID);

    var selection = getSelection(txtarea);
    var text = selection.getText();
    var opts;

    // don't include trailing space in selection
    if(text.charAt(text.length - 1) == ' '){
        selection.end--;
        text = selection.getText();
    }

    if(!text){
        // nothing selected, use the sample text and select it
        text = sampleText;
        opts = {
            startofs: tagOpen.length,
            endofs: tagClose.length
        };
    }else{
        // place cursor at the end
        opts = {
            nosel: true
        };
    }

    // surround with tags
    text = tagOpen + text + tagClose;

    // do it
    pasteText(selection,text,opts);
}

/**
 * Wraps around pasteText() for backward compatibility
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function insertAtCarret(textAreaID, text){
    var txtarea = $(textAreaID);
    var selection = getSelection(txtarea);
    pasteText(selection,text,{nosel: true});
}



/* XXXXXXXXXX end of lib/scripts/textselection.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/toolbar.js XXXXXXXXXX */


// used to identify pickers
var pickercounter=0;

/**
 * Create a toolbar
 *
 * @param  string tbid ID of the element where to insert the toolbar
 * @param  string edid ID of the editor textarea
 * @param  array  tb   Associative array defining the buttons
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function initToolbar(tbid,edid,tb){
    var toolbar = $(tbid);
    if(!toolbar) return;
    var edit = $(edid);
    if(!edit) return;
    if(edit.readOnly) return;

    //empty the toolbar area:
    toolbar.innerHTML='';

    var cnt = tb.length;
    for(var i=0; i<cnt; i++){
        var actionFunc;

        // create new button
        var btn = createToolButton(tb[i]['icon'],
                                   tb[i]['title'],
                                   tb[i]['key']);


        // type is a tb function -> assign it as onclick
        actionFunc = 'tb_'+tb[i]['type'];
        if( isFunction(window[actionFunc]) ){
            addEvent(btn,'click', bind(window[actionFunc],btn,tb[i],edid));
            toolbar.appendChild(btn);
            continue;
        }

        // type is a init function -> execute it
        actionFunc = 'addBtnAction'+tb[i]['type'].charAt(0).toUpperCase()+tb[i]['type'].substring(1);
        if( isFunction(window[actionFunc]) ){
            if(window[actionFunc](btn, tb[i], edid)){
                toolbar.appendChild(btn);
            }
            continue;
        }

        alert('unknown toolbar type: '+tb[i]['type']+'  '+actionFunc);
    } // end for

}

/**
 * Button action for format buttons
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @author Gabriel Birke <birke@d-scribe.de>
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function tb_format(btn, props, edid) {
    var sample = props['title'];
    if(props['sample']){
        sample = props['sample'];
    }
    insertTags(edid,
               fixtxt(props['open']),
               fixtxt(props['close']),
               fixtxt(sample));
    pickerClose();
    return false;
}

/**
 * Button action for format buttons
 *
 * This works exactly as tb_format() except that, if multiple lines
 * are selected, each line will be formatted seperately
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @author Gabriel Birke <birke@d-scribe.de>
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function tb_formatln(btn, props, edid) {
    var sample = props['title'];
    if(props['sample']){
        sample = props['sample'];
    }
    sample = fixtxt(sample);

    props['open']  = fixtxt(props['open']);
    props['close'] = fixtxt(props['close']);

    // is something selected?
    var opts;
    var selection = getSelection($(edid));
    if(selection.getLength()){
        sample = selection.getText();
        opts = {nosel: true};
    }else{
        opts = {
            startofs: props['open'].length,
            endofs: props['close'].length
        };
    }

    sample = sample.split("\n").join(props['close']+"\n"+props['open']);
    sample = props['open']+sample+props['close'];

    pasteText(selection,sample,opts);

    pickerClose();
    return false;
}

/**
 * Button action for insert buttons
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @author Gabriel Birke <birke@d-scribe.de>
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function tb_insert(btn, props, edid) {
    insertAtCarret(edid,fixtxt(props['insert']));
    pickerClose();
    return false;
}

/**
 * Button action for the media popup
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function tb_mediapopup(btn, props, edid) {
    window.open(
        DOKU_BASE+props['url']+encodeURIComponent(NS),
        props['name'],
        props['options']);
    return false;
}

/**
 * Button action for automatic headlines
 *
 * Insert a new headline based on the current section level
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function tb_autohead(btn, props, edid){
    var lvl = currentHeadlineLevel(edid);

    // determine new level
    lvl += props['mod'];
    if(lvl < 1) lvl = 1;
    if(lvl > 5) lvl = 5;

    var tags = '=';
    for(var i=0; i<=5-lvl; i++) tags += '=';
    insertTags(edid, tags+' ', ' '+tags+"\n", props['text']);
    pickerClose();
    return false;
}


/**
 * Add button action for picker buttons and create picker element
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @return boolean    If button should be appended
 * @author Gabriel Birke <birke@d-scribe.de>
 */
function addBtnActionPicker(btn, props, edid) {
    var pickerid = 'picker'+(pickercounter++);
    createPicker(pickerid, props, edid);
    addEvent(btn,'click',function(){
        pickerToggle(pickerid,btn);
        return false;
    });
    return true;
}

/**
 * Add button action for the link wizard button
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @return boolean    If button should be appended
 * @author Andreas Gohr <gohr@cosmocode.de>
 */
function addBtnActionLinkwiz(btn, props, edid) {
    linkwiz.init($(edid));
    addEvent(btn,'click',function(){
        linkwiz.toggle();
        return false;
    });
    return true;
}

/**
 * Show/Hide a previosly created picker window
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function pickerToggle(pickerid,btn){
    var picker = $(pickerid);
    if(picker.style.marginLeft == '-10000px'){
        var x = findPosX(btn);
        var y = findPosY(btn);
        picker.style.left = (x+3)+'px';
        picker.style.top = (y+btn.offsetHeight+3)+'px';
        picker.style.marginLeft = '0px';
    }else{
        picker.style.marginLeft = '-10000px';
    }
}

/**
 * Close all open pickers
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function pickerClose(){
    var pobjs = getElementsByClass('picker');
    for(var i=0; i<pobjs.length; i++){
        pobjs[i].style.marginLeft = '-10000px';
    }
}


/**
 * Replaces \n with linebreaks
 */
function fixtxt(str){
    return str.replace(/\\n/g,"\n");
}



/* XXXXXXXXXX end of lib/scripts/toolbar.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/edit.js XXXXXXXXXX */

/**
 * Functions for text editing (toolbar stuff)
 *
 * @todo most of the stuff in here should be revamped and then moved to toolbar.js
 * @author Andreas Gohr <andi@splitbrain.org>
 */

/**
 * Creates a toolbar button through the DOM
 *
 * Style the buttons through the toolbutton class
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function createToolButton(icon,label,key,id){
    var btn = document.createElement('button');
    var ico = document.createElement('img');

    // preapare the basic button stuff
    btn.className = 'toolbutton';
    btn.title = label;
    if(key){
        btn.title += ' ['+key.toUpperCase()+']';
        btn.accessKey = key;
    }

    // set IDs if given
    if(id){
        btn.id = id;
        ico.id = id+'_ico';
    }

    // create the icon and add it to the button
    if(icon.substr(0,1) == '/'){
        ico.src = icon;
    }else{
        ico.src = DOKU_BASE+'lib/images/toolbar/'+icon;
    }
    btn.appendChild(ico);

    return btn;
}

/**
 * Creates a picker window for inserting text
 *
 * The given list can be an associative array with text,icon pairs
 * or a simple list of text. Style the picker window through the picker
 * class or the picker buttons with the pickerbutton class. Picker
 * windows are appended to the body and created invisible.
 *
 * @param  string id    the ID to assign to the picker
 * @param  array  props the properties for the picker
 * @param  string edid  the ID of the textarea
 * @rteurn DOMobject    the created picker
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function createPicker(id,props,edid){
    var icobase = props['icobase'];
    var list    = props['list'];

    // create the wrapping div
    var picker            = document.createElement('div');
    picker.className      = 'picker';
    if(props['class']){
        picker.className += ' '+props['class'];
    }
    picker.id               = id;
    picker.style.position   = 'absolute';
    picker.style.marginLeft = '-10000px'; // no display:none, to keep access keys working

    for(var key in list){
        if (!list.hasOwnProperty(key)) continue;

        if(isNaN(key)){
            // associative array -> treat as image/value pairs
            var btn = document.createElement('button');
            btn.className = 'pickerbutton';
            var ico = document.createElement('img');
            if(list[key].substr(0,1) == '/'){
                ico.src = list[key];
            }else{
                ico.src = DOKU_BASE+'lib/images/'+icobase+'/'+list[key];
            }
            btn.title     = key;
            btn.appendChild(ico);
            addEvent(btn,'click',bind(pickerInsert,key,edid));
            picker.appendChild(btn);
        }else if(isString(list[key])){
            // a list of text -> treat as text picker
            var btn = document.createElement('button');
            btn.className = 'pickerbutton';
            var txt = document.createTextNode(list[key]);
            btn.title     = list[key];
            btn.appendChild(txt);
            addEvent(btn,'click',bind(pickerInsert,list[key],edid));
            picker.appendChild(btn);
        }else{
            // a list of lists -> treat it as subtoolbar
            initToolbar(picker,edid,list);
            break; // all buttons handled already
        }

    }
    var body = document.getElementsByTagName('body')[0];
    body.appendChild(picker);
    return picker;
}

/**
 * Called by picker buttons to insert Text and close the picker again
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function pickerInsert(text,edid){
    insertAtCarret(edid,text);
    pickerClose();
}

/**
 * Add button action for signature button
 *
 * @param  DOMElement btn   Button element to add the action to
 * @param  array      props Associative array of button properties
 * @param  string     edid  ID of the editor textarea
 * @return boolean    If button should be appended
 * @author Gabriel Birke <birke@d-scribe.de>
 */
function addBtnActionSignature(btn, props, edid) {
    if(typeof(SIG) != 'undefined' && SIG != ''){
        addEvent(btn,'click',bind(insertAtCarret,edid,SIG));
        return true;
    }
    return false;
}

/**
 * Make intended formattings easier to handle
 *
 * Listens to all key inputs and handle indentions
 * of lists and code blocks
 *
 * Currently handles space, backspce and enter presses
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 * @fixme handle tabs
 */
function keyHandler(e){
    if(e.keyCode != 13 &&
       e.keyCode != 8  &&
       e.keyCode != 32) return;
    var field     = e.target;
    var selection = getSelection(field);
    var search    = "\n"+field.value.substr(0,selection.start);
    var linestart = Math.max(search.lastIndexOf("\n"),
                             search.lastIndexOf("\r")); //IE workaround
    search = search.substr(linestart);


    if(e.keyCode == 13){ // Enter
        // keep current indention for lists and code
        var match = search.match(/(\n  +([\*-] ?)?)/);
        if(match){
            var scroll = field.scrollHeight;
            insertAtCarret(field.id,match[1]);
            field.scrollTop += (field.scrollHeight - scroll);
            e.preventDefault(); // prevent enter key
            return false;
        }
    }else if(e.keyCode == 8){ // Backspace
        // unindent lists
        var match = search.match(/(\n  +)([*-] ?)$/);
        if(match){
            var spaces = match[1].length-1;

            if(spaces > 3){ // unindent one level
                field.value = field.value.substr(0,linestart)+
                              field.value.substr(linestart+2);
                selection.start = selection.start - 2;
                selection.end   = selection.start;
            }else{ // delete list point
                field.value = field.value.substr(0,linestart)+
                              field.value.substr(selection.start);
                selection.start = linestart;
                selection.end   = linestart;
            }
            setSelection(selection);
            e.preventDefault(); // prevent backspace
            return false;
        }
    }else if(e.keyCode == 32){ // Space
        // intend list item
        var match = search.match(/(\n  +)([*-] )$/);
        if(match){
            field.value = field.value.substr(0,linestart)+'  '+
                          field.value.substr(linestart);
            selection.start = selection.start + 2;
            selection.end   = selection.start;
            setSelection(selection);
            e.preventDefault(); // prevent space
            return false;
        }
    }
}

//FIXME consolidate somewhere else
addInitEvent(function(){
    var field = $('wiki__text');
    if(!field) return;
    addEvent(field,'keydown',keyHandler);
});

/**
 * Determine the current section level while editing
 *
 * @author Andreas Gohr <gohr@cosmocode.de>
 */
function currentHeadlineLevel(textboxId){
    var field     = $(textboxId);
    var selection = getSelection(field);
    var search    = "\n"+field.value.substr(0,selection.start);
    var lasthl    = search.lastIndexOf("\n==");
    if(lasthl == -1 && field.form.prefix){
        // we need to look in prefix context
        search = field.form.prefix.value;
        lasthl    = search.lastIndexOf("\n==");
    }
    search    = search.substr(lasthl+1,6);

    if(search == '======') return 1;
    if(search.substr(0,5) == '=====') return 2;
    if(search.substr(0,4) == '====') return 3;
    if(search.substr(0,3) == '===') return 4;
    if(search.substr(0,2) == '==') return 5;

    return 0;
}


/**
 * global var used for not saved yet warning
 */
var textChanged = false;

/**
 * Check for changes before leaving the page
 */
function changeCheck(msg){
  if(textChanged){
    var ok = confirm(msg);
    if(ok){
        // remove a possibly saved draft using ajax
        var dwform = $('dw__editform');
        if(dwform){
            var params = 'call=draftdel';
            params += '&id='+encodeURIComponent(dwform.elements.id.value);

            var sackobj = new sack(DOKU_BASE + 'lib/exe/ajax.php');
            sackobj.AjaxFailedAlert = '';
            sackobj.encodeURIString = false;
            sackobj.runAJAX(params);
            // we send this request blind without waiting for
            // and handling the returned data
        }
    }
    return ok;
  }else{
    return true;
  }
}

/**
 * Add changeCheck to all Links and Forms (except those with a
 * JSnocheck class), add handlers to monitor changes
 *
 * Sets focus to the editbox as well
 *
 * @fixme this is old and crappy code. needs to be redone
 */
function initChangeCheck(msg){
    var edit_text   = document.getElementById('wiki__text');
    if(!edit_text) return;
    if(edit_text.readOnly) return;
    if(!$('dw__editform')) return;

    // add change check for links
    var links = document.getElementsByTagName('a');
    for(var i=0; i < links.length; i++){
        if(links[i].className.indexOf('JSnocheck') == -1){
            links[i].onclick = function(){
                                    var rc = changeCheck(msg);
                                    if(window.event) window.event.returnValue = rc;
                                    return rc;
                               };
        }
    }
    // add change check for forms
    var forms = document.forms;
    for(i=0; i < forms.length; i++){
        if(forms[i].className.indexOf('JSnocheck') == -1){
            forms[i].onsubmit = function(){
                                    var rc = changeCheck(msg);
                                    if(window.event) window.event.returnValue = rc;
                                    return rc;
                               };
        }
    }

    // reset change memory var on submit
    var btn_save        = document.getElementById('edbtn__save');
    btn_save.onclick    = function(){ textChanged = false; };
    var btn_prev        = document.getElementById('edbtn__preview');
    btn_prev.onclick    = function(){ textChanged = false; };

    // add change memory setter
    edit_text.onchange = function(){
        textChanged = true; //global var
        summaryCheck();
    };
    var summary = document.getElementById('edit__summary');
    addEvent(summary, 'change', summaryCheck);
    addEvent(summary, 'keyup', summaryCheck);
    if (textChanged) summaryCheck();

    // set focus
    edit_text.focus();
}

/**
 * Checks if a summary was entered - if not the style is changed
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
function summaryCheck(){
    var sum = document.getElementById('edit__summary');
    if(sum.value === ''){
        sum.className='missing';
    }else{
        sum.className='edit';
    }
}


/**
 * Class managing the timer to display a warning on a expiring lock
 */
function locktimer_class(){
        this.sack     = null;
        this.timeout  = 0;
        this.timerID  = null;
        this.lasttime = null;
        this.msg      = '';
        this.pageid   = '';
};
var locktimer = new locktimer_class();
    locktimer.init = function(timeout,msg,draft){
        // init values
        locktimer.timeout  = timeout*1000;
        locktimer.msg      = msg;
        locktimer.draft    = draft;
        locktimer.lasttime = new Date();

        if(!$('dw__editform')) return;
        locktimer.pageid = $('dw__editform').elements.id.value;
        if(!locktimer.pageid) return;

        // init ajax component
        locktimer.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        locktimer.sack.AjaxFailedAlert = '';
        locktimer.sack.encodeURIString = false;
        locktimer.sack.onCompletion = locktimer.refreshed;

        // register refresh event
        addEvent($('dw__editform').elements.wikitext,'keypress',function(){locktimer.refresh();});

        // start timer
        locktimer.reset();
    };

    /**
     * (Re)start the warning timer
     */
    locktimer.reset = function(){
        locktimer.clear();
        locktimer.timerID = window.setTimeout("locktimer.warning()", locktimer.timeout);
    };

    /**
     * Display the warning about the expiring lock
     */
    locktimer.warning = function(){
        locktimer.clear();
        alert(locktimer.msg);
    };

    /**
     * Remove the current warning timer
     */
    locktimer.clear = function(){
        if(locktimer.timerID !== null){
            window.clearTimeout(locktimer.timerID);
            locktimer.timerID = null;
        }
    };

    /**
     * Refresh the lock via AJAX
     *
     * Called on keypresses in the edit area
     */
    locktimer.refresh = function(){
        var now = new Date();
        // refresh every minute only
        if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){ //FIXME decide on time
            var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid);
            if(locktimer.draft){
                var dwform = $('dw__editform');
                params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value);
                params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value);
                params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value);
                params += '&date='+encodeURIComponent(dwform.elements.date.value);
            }
            locktimer.sack.runAJAX(params);
            locktimer.lasttime = now;
        }
    };


    /**
     * Callback. Resets the warning timer
     */
    locktimer.refreshed = function(){
        var data  = this.response;
        var error = data.charAt(0);
            data  = data.substring(1);

        $('draft__status').innerHTML=data;
        if(error != '1') return; // locking failed
        locktimer.reset();
    };
// end of locktimer class functions



/* XXXXXXXXXX end of lib/scripts/edit.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/linkwiz.js XXXXXXXXXX */

/**
 * The Link Wizard
 *
 * @author Andreas Gohr <gohr@cosmocode.de>
 */
var linkwiz = {
    wiz:    null,
    entry:  null,
    result: null,
    timer:  null,
    sack:   null,
    textArea: null,
    selected: -1,
    selection: null,

    /**
     * Initialize the linkwizard by creating the needed HTML
     * and attaching the eventhandlers
     */
    init: function(textArea){
        // prepare AJAX object
        linkwiz.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        linkwiz.sack.AjaxFailedAlert = '';
        linkwiz.sack.encodeURIString = false;

        // create HTML Structure
        linkwiz.wiz = document.createElement('div');
        linkwiz.wiz.id = 'link__wiz';
        linkwiz.wiz.className     = 'picker';
        linkwiz.wiz.style.top  = (findPosY(textArea)+20)+'px';
        linkwiz.wiz.style.left = (findPosX(textArea)+80)+'px';
        linkwiz.wiz.style.marginLeft = '-10000px';

        linkwiz.wiz.innerHTML =
             '<div id="link__wiz_header">'+
             '<img src="'+DOKU_BASE+'lib/images/close.png" width="16" height="16" align="right" alt="" id="link__wiz_close" />'+
             LANG['linkwiz']+'</div>'+
             '<div>'+LANG['linkto']+' <input type="text" class="edit" id="link__wiz_entry" autocomplete="off" /></div>'+
             '<div id="link__wiz_result"></div>';
        textArea.form.parentNode.appendChild(linkwiz.wiz);
        linkwiz.textArea = textArea;
        linkwiz.result = $('link__wiz_result');
        linkwiz.entry = $('link__wiz_entry');

        // attach event handlers
        var obj;
        obj = $('link__wiz_close');
        obj.onclick = linkwiz.hide;

        linkwiz.sack.elementObj = linkwiz.result;
        addEvent(linkwiz.entry,'keyup',linkwiz.onEntry);
        addEvent(linkwiz.result,'click',linkwiz.onResultClick);
        drag.attach(linkwiz.wiz,$('link__wiz_header'));
    },

    /**
     * handle all keyup events in the entry field
     */
    onEntry: function(e){
        if(e.keyCode == 37 || e.keyCode == 39){ //left/right
            return true; //ignore
        }
        if(e.keyCode == 27){
            linkwiz.hide();
            e.preventDefault();
            e.stopPropagation();
            return false;
        }
        if(e.keyCode == 38){ //Up
            linkwiz.select(linkwiz.selected -1);
            e.preventDefault();
            e.stopPropagation();
            return false;
        }
        if(e.keyCode == 40){ //Down
            linkwiz.select(linkwiz.selected +1);
            e.preventDefault();
            e.stopPropagation();
            return false;
        }
        if(e.keyCode == 13){ //Enter
            if(linkwiz.selected > -1){
                var obj = linkwiz.getResult(linkwiz.selected);
                if(obj){
                    var a = obj.getElementsByTagName('A')[0];
                    linkwiz.resultClick(a);
                }
            }else if(linkwiz.entry.value){
                linkwiz.insertLink(linkwiz.entry.value);
            }

            e.preventDefault();
            e.stopPropagation();
            return false;
        }
        linkwiz.autocomplete();
    },

    /**
     * Get one of the result by index
     *
     * @param int result div to return
     * @returns DOMObject or null
     */
    getResult: function(num){
        var obj;
        var childs = linkwiz.result.getElementsByTagName('DIV');
        obj = childs[num];
        if(obj){
            return obj;
        }else{
            return null;
        }
    },

    /**
     * Select the given result
     */
    select: function(num){
        if(num < 0){
            linkwiz.deselect();
            return;
        }

        var obj = linkwiz.getResult(num);
        if(obj){
            linkwiz.deselect();
            obj.className += ' selected';

            // make sure the item is viewable in the scroll view
            // FIXME check IE compatibility
            if(obj.offsetTop > linkwiz.result.scrollTop + linkwiz.result.clientHeight){
                linkwiz.result.scrollTop += obj.clientHeight;
            }else if(obj.offsetTop - linkwiz.result.clientHeight < linkwiz.result.scrollTop){ // this works but isn't quite right, fixes welcome
                linkwiz.result.scrollTop -= obj.clientHeight;
            }
            // now recheck - if still not in view, the user used the mouse to scroll
            if( (obj.offsetTop > linkwiz.result.scrollTop + linkwiz.result.clientHeight) ||
                (obj.offsetTop < linkwiz.result.scrollTop) ){
                obj.scrollIntoView();
            }

            linkwiz.selected = num;
        }
    },

    /**
     * deselect a result if any is selected
     */
    deselect: function(){
        if(linkwiz.selected > -1){
            var obj = linkwiz.getResult(linkwiz.selected);
            if(obj){
                obj.className = obj.className.replace(/ ?selected/,'');
            }
        }
        linkwiz.selected = -1;
    },

    /**
     * Handle clicks in the result set an dispatch them to
     * resultClick()
     */
    onResultClick: function(e){
        if(e.target.tagName != 'A') return;
        e.stopPropagation();
        e.preventDefault();
        linkwiz.resultClick(e.target);
        return false;
    },

    /**
     * Handles the "click" on a given result anchor
     */
    resultClick: function(a){
        var id = a.title;
        if(id == '' || id.substr(id.length-1) == ':'){
            linkwiz.entry.value = id;
            linkwiz.autocomplete_exec();
        }else{
            linkwiz.entry.value = id;
            if(a.nextSibling && a.nextSibling.tagName == 'SPAN'){
                linkwiz.insertLink(a.nextSibling.innerHTML);
            }else{
                linkwiz.insertLink('');
            }
        }
    },

    /**
     * Insert the id currently in the entry box to the textarea,
     * replacing the current selection or at the curso postion.
     * When no selection is available the given title will be used
     * as link title instead
     */
    insertLink: function(title){
        if(!linkwiz.entry.value) return;

        var sel = getSelection(linkwiz.textArea);
        if(sel.start == 0 && sel.end == 0) sel = linkwiz.selection;

        var stxt = sel.getText();
        if(!stxt && !DOKU_UHC) stxt=title;

        // prepend colon inside namespaces for non namespace pages
        if(linkwiz.textArea.form['id'].value.indexOf(':') != -1 &&
           linkwiz.entry.value.indexOf(':') == -1){
            linkwiz.entry.value = ':'+linkwiz.entry.value;
        }

        var link = '[['+linkwiz.entry.value+'|';
        if(stxt) link += stxt;
        link += ']]';

        var so = linkwiz.entry.value.length+3;
        var eo = 2;

        pasteText(sel,link,{startofs: so, endofs: eo});
        linkwiz.hide();
    },

    /**
     * Start the page/namespace lookup timer
     *
     * Calls autocomplete_exec when the timer runs out
     */
    autocomplete: function(){
        if(linkwiz.timer !== null){
            window.clearTimeout(linkwiz.timer);
            linkwiz.timer = null;
        }

        linkwiz.timer = window.setTimeout(linkwiz.autocomplete_exec,350);
    },

    /**
     * Executes the AJAX call for the page/namespace lookup
     */
    autocomplete_exec: function(){
        linkwiz.deselect();
        linkwiz.result.innerHTML = '<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />';
        linkwiz.sack.runAJAX('call=linkwiz&q='+encodeURI(linkwiz.entry.value));
    },

    /**
     * Clears the result area
     */
    clear: function(){
        linkwiz.result.innerHTML = 'Search for a matching page name above, or browse through the pages on the right';
        linkwiz.entry.value = '';
    },

    /**
     * Show the linkwizard
     */
    show: function(){
        linkwiz.selection  = getSelection(linkwiz.textArea);
        linkwiz.wiz.style.marginLeft = '0px';
        linkwiz.entry.focus();
        linkwiz.autocomplete();
    },

    /**
     * Hide the link wizard
     */
    hide: function(){
        linkwiz.wiz.style.marginLeft = '-10000px';
        linkwiz.textArea.focus();
    },

    /**
     * Toggle the link wizard
     */
    toggle: function(){
        if(linkwiz.wiz.style.marginLeft == '-10000px'){
            linkwiz.show();
        }else{
            linkwiz.hide();
        }
    }
};



/* XXXXXXXXXX end of lib/scripts/linkwiz.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/scripts/media.js XXXXXXXXXX */

/**
 * JavaScript functionalitiy for the media management popup
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
var media_manager = {
    keepopen: false,
    hide: false,

    /**
     * Attach event handlers to all "folders" below the given element
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    treeattach: function(obj){
        if(!obj) return;

        var items = obj.getElementsByTagName('li');
        for(var i=0; i<items.length; i++){
            var elem = items[i];

            // attach action to make the +/- clickable
            var clicky = elem.getElementsByTagName('img')[0];
            clicky.style.cursor = 'pointer';
            addEvent(clicky,'click',function(event){ return media_manager.toggle(event,this); });

            // attach action load folder list via AJAX
            var link = elem.getElementsByTagName('a')[0];
            link.style.cursor = 'pointer';
            addEvent(link,'click',function(event){ return media_manager.list(event,this); });
        }
    },

    /**
     * Attach the image selector action to all links below the given element
     * also add the action to autofill the "upload as" field
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    selectorattach: function(obj){
        if(!obj) return;

        var items = getElementsByClass('select',obj,'a');
        for(var i=0; i<items.length; i++){
            var elem = items[i];
            elem.style.cursor = 'pointer';
            addEvent(elem,'click',function(event){ return media_manager.select(event,this); });
        }

        // hide syntax example
        items = getElementsByClass('example',obj,'div');
        for(var i=0; i<items.length; i++){
            elem = items[i];
            elem.style.display = 'none';
        }

        var file = $('upload__file');
        if(!file) return;
        addEvent(file,'change',media_manager.suggest);
    },

    /**
     * Attach deletion confirmation dialog to the delete buttons.
     *
     * Michael Klier <chi@chimeric.de>
     */
    confirmattach: function(obj){
        if(!obj) return;

        items = getElementsByClass('btn_media_delete',obj,'a');
        for(var i=0; i<items.length; i++){
            var elem = items[i];
            addEvent(elem,'click',function(e){
                if(e.target.tagName == 'IMG'){
                    var name = e.target.parentNode.title;
                }else{
                    var name = e.target.title;
                }
                if(!confirm(LANG['del_confirm'] + "\n" + name)) {
                    e.preventDefault();
                    return false;
                } else {
                    return true;
                }
            });
        }
    },

    /**
     * Creates checkboxes for additional options
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    attachoptions: function(obj){
        if(!obj) return;

        // keep open
        if(opener){
            var kobox  = document.createElement('input');
            kobox.type = 'checkbox';
            kobox.id   = 'media__keepopen';
            if(DokuCookie.getValue('keepopen')){
                kobox.checked  = true;
                kobox.defaultChecked = true; //IE wants this
                media_manager.keepopen = true;
            }
            addEvent(kobox,'click',function(event){ return media_manager.togglekeepopen(event,this); });

            var kolbl  = document.createElement('label');
            kolbl.htmlFor   = 'media__keepopen';
            kolbl.innerHTML = LANG['keepopen'];

            var kobr = document.createElement('br');

            obj.appendChild(kobox);
            obj.appendChild(kolbl);
            obj.appendChild(kobr);
        }

        // hide details
        var hdbox  = document.createElement('input');
        hdbox.type = 'checkbox';
        hdbox.id   = 'media__hide';
        if(DokuCookie.getValue('hide')){
            hdbox.checked = true;
            hdbox.defaultChecked = true; //IE wants this
            media_manager.hide    = true;
        }
        addEvent(hdbox,'click',function(event){ return media_manager.togglehide(event,this); });

        var hdlbl  = document.createElement('label');
        hdlbl.htmlFor   = 'media__hide';
        hdlbl.innerHTML = LANG['hidedetails'];

        var hdbr = document.createElement('br');

        obj.appendChild(hdbox);
        obj.appendChild(hdlbl);
        obj.appendChild(hdbr);
        media_manager.updatehide();
    },

    /**
     * Opens the searchfield
     *
     * @author Tobias Sarnowski <sarnowski@cosmocode.de>
     */
    showsearchfield: function(event,link){
        // prepare an AJAX call to fetch the search
        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        cleanMsgArea();

        var content = $('media__content');
        content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />';

        ajax.elementObj = content;
        ajax.afterCompletion = function(){
            media_manager.selectorattach(content);
            media_manager.confirmattach(content);
            media_manager.updatehide();
        };
        ajax.runAJAX(link.search.substr(1)+'&call=mediasearchlist');
        return false;
    },

    /**
     * Toggles the keep open state
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    togglekeepopen: function(event,cb){
        if(cb.checked){
            DokuCookie.setValue('keepopen',1);
            media_manager.keepopen = true;
        }else{
            DokuCookie.setValue('keepopen','');
            media_manager.keepopen = false;
        }
    },

    /**
     * Toggles the hide details state
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    togglehide: function(event,cb){
        if(cb.checked){
            DokuCookie.setValue('hide',1);
            media_manager.hide = true;
        }else{
            DokuCookie.setValue('hide','');
            media_manager.hide = false;
        }
        media_manager.updatehide();
    },

    /**
     * Sets the visibility of the image details accordingly to the
     * chosen hide state
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    updatehide: function(){
        var obj = $('media__content');
        if(!obj) return;
        var details = getElementsByClass('detail',obj,'div');
        for(var i=0; i<details.length; i++){
            if(media_manager.hide){
                details[i].style.display = 'none';
            }else{
                details[i].style.display = '';
            }
        }
    },

    /**
     * Insert the clicked image into the opener's textarea
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    select: function(event,link){
        var id = link.name.substr(2);

        if(!opener){
            // if we don't run in popup display example
            var ex = $('ex_'+id.replace(/:/g,'_'));
            if(ex.style.display == ''){
                ex.style.display = 'none';
            }else{
                ex.style.display = '';
            }
            return false;
        }
        opener.insertTags('wiki__text','{{'+id+'|','}}','');

        if(!media_manager.keepopen) window.close();
        opener.focus();
        return false;
    },

    /**
     * list the content of a namespace using AJAX
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    list: function(event,link){
        // prepare an AJAX call to fetch the subtree
        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        cleanMsgArea();

        var content = $('media__content');
        content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />';

        ajax.elementObj = content;
        ajax.afterCompletion = function(){
            media_manager.selectorattach(content);
            media_manager.confirmattach(content);
            media_manager.updatehide();
            media_manager.initFlashUpload();
        };
        ajax.runAJAX(link.search.substr(1)+'&call=medialist');
        return false;
    },


    /**
     * Open or close a subtree using AJAX
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    toggle: function(event,clicky){
        var listitem = clicky.parentNode;

        // if already open, close by removing the sublist
        var sublists = listitem.getElementsByTagName('ul');
        if(sublists.length){
            listitem.removeChild(sublists[0]);
            clicky.src = DOKU_BASE+'lib/images/plus.gif';
            return false;
        }

        // get the enclosed link (is always the first one)
        var link = listitem.getElementsByTagName('a')[0];

        // prepare an AJAX call to fetch the subtree
        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        //prepare the new ul
        var ul = document.createElement('ul');
        //fixme add classname here
        listitem.appendChild(ul);
        ajax.elementObj = ul;
        ajax.afterCompletion = function(){ media_manager.treeattach(ul); };
        ajax.runAJAX(link.search.substr(1)+'&call=medians');
        clicky.src = DOKU_BASE+'lib/images/minus.gif';
        return false;
    },

    /**
     * Prefills the wikiname.
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    suggest: function(){
        var file = $('upload__file');
        var name = $('upload__name');
        if(!file || !name) return;

        var text = file.value;
        text = text.substr(text.lastIndexOf('/')+1);
        text = text.substr(text.lastIndexOf('\\')+1);
        name.value = text;
    },


    initFlashUpload: function(){
        if(!hasFlash(8)) return;
        var oform  = $('dw__upload');
        var oflash = $('dw__flashupload');
        if(!oform || !oflash) return;

        var clicky = document.createElement('img');
        clicky.src     = DOKU_BASE+'lib/images/multiupload.png';
        clicky.title   = LANG['mu_btn'];
        clicky.alt     = LANG['mu_btn'];
        clicky.style.cursor = 'pointer';
        clicky.onclick = function(){
                            oform.style.display  = 'none';
                            oflash.style.display = '';
                         };
        oform.appendChild(clicky);
    }
};

addInitEvent(function(){
    media_manager.treeattach($('media__tree'));
    media_manager.selectorattach($('media__content'));
    media_manager.confirmattach($('media__content'));
    media_manager.attachoptions($('media__opts'));
    media_manager.initFlashUpload();
});


/* XXXXXXXXXX end of lib/scripts/media.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/tpl/monobook/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/tpl/monobook/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/plugin/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/plugin/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/note/script.js XXXXXXXXXX */

/* Add Note buttons to the toolbar */
/* from http://wiki.splitbrain.org/wiki:tips:toolbarbutton */

/* Disabled because this does not allow to select a text and turn it into a note like the type:format does
var notes_arr = new Array(); // key = insertion string , value = icon filename.
notes_arr['<note></note>\\n']='tb_note.png';
notes_arr['<note tip></note>\\n']='tb_tip.png';
notes_arr['<note important></note>\\n']='tb_important.png';
notes_arr['<note warning></note>\\n']='tb_warning.png';

toolbar[toolbar.length] = {"type":"picker",
                           "title":"Notes",
                           "icon":"../../plugins/note/images/tb_note.png",
                           "key":"",
                           "list": notes_arr,
                           "icobase":"../plugins/note/images"};
*/
 
if(toolbar){ 
    toolbar[toolbar.length] = {"type":"format", "title":"note", "key":"", 
                               "icon":"../../plugins/note/images/tb_note.png", 
                               "open":"<note>", "close":"</note>"
                              }; 
    toolbar[toolbar.length] = {"type":"format", "title":"tip", "key":"", 
                               "icon":"../../plugins/note/images/tb_tip.png", 
                               "open":"<note tip>", "close":"</note>"
                              }; 
    toolbar[toolbar.length] = {"type":"format", "title":"important", "key":"", 
                               "icon":"../../plugins/note/images/tb_important.png", 
                               "open":"<note important>", "close":"</note>"
                              }; 
    toolbar[toolbar.length] = {"type":"format", "title":"warning", "key":"", 
                               "icon":"../../plugins/note/images/tb_warning.png", 
                               "open":"<note warning>", "close":"</note>"
                              }; 
}


/* XXXXXXXXXX end of lib/plugins/note/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/usermanager/script.js XXXXXXXXXX */

/**
 * Add JavaScript confirmation to the User Delete button
 */
function usrmgr_delconfirm(){
    if($('usrmgr__del')){
        addEvent( $('usrmgr__del'),'click',function(){ return confirm(reallyDel); } );
    }
};
addInitEvent(usrmgr_delconfirm);


/* XXXXXXXXXX end of lib/plugins/usermanager/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/acl/script.js XXXXXXXXXX */

acl = {
    init: function(){
        this.ctl = $('acl_manager');
        if(!this.ctl) return;

        var sel = $('acl__user').getElementsByTagName('select')[0];

        addEvent(sel,'change',acl.userselhandler);
        addEvent($('acl__tree'),'click',acl.treehandler);
        addEvent($('acl__user').getElementsByTagName('input')[1],'click',acl.loadinfo);
    },


    /**
     * Handle user dropdown
     */
    userselhandler: function(e){
        // make entry field visible/invisible
        if(this.value == '__g__' || this.value == '__u__'){
            $('acl__user').getElementsByTagName('input')[0].style.display = ''; //acl_w
            $('acl__user').getElementsByTagName('input')[1].style.display = ''; //submit
        }else{
            $('acl__user').getElementsByTagName('input')[0].style.display = 'none';
            $('acl__user').getElementsByTagName('input')[1].style.display = 'none';
        }

        acl.loadinfo();
    },

    /**
     * Load the current permission info and edit form
     *
     * @param frm - Form element with needed data
     */
    loadinfo: function(){
        // get form
        var frm = $('acl__detail').getElementsByTagName('form')[0];

        // prepare an AJAX call
        var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        // prepare data
        var data = Array();
        data[0] = ajax.encVar('ns',frm.elements['ns'].value);
        data[1] = ajax.encVar('id',frm.elements['id'].value);
        data[2] = ajax.encVar('acl_t',frm.elements['acl_t'].value);
        data[3] = ajax.encVar('acl_w',frm.elements['acl_w'].value);
        data[4] = ajax.encVar('sectok',frm.elements['sectok'].value);
        data[5] = ajax.encVar('ajax','info');

        ajax.elementObj = $('acl__info');

        ajax.runAJAX(data.join('&'));
        return false;
    },

    /**
     * parse URL attributes into a associative array
     *
     * @todo put into global script lib?
     */
    parseatt: function(str){
        if(str[0] == '?') str = str.substr(1);
        var attributes = {};
        var all = str.split('&');
        for(var i=0; i<all.length; i++){
            var att = all[i].split('=');
            attributes[att[0]] = decodeURIComponent(att[1]);
        }
        return attributes;
    },

    /**
     * htmlspecialchars equivalent
     *
     * @todo put in gloabl scripts lib?
     */
    hsc: function(str) {
        str = str.replace(/&/g,"&amp;");
        str = str.replace(/\"/g,"&quot;");
        str = str.replace(/\'/g,"&#039;");
        str = str.replace(/</g,"&lt;");
        str = str.replace(/>/g,"&gt;");
        return str;
    },


    /**
     * Open or close a subtree using AJAX
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    treetoggle: function(clicky){
        var listitem = clicky.parentNode.parentNode;

        // if already open, close by removing the sublist
        var sublists = listitem.getElementsByTagName('ul');
        if(sublists.length){
            listitem.removeChild(sublists[0]);
            clicky.src = DOKU_BASE+'lib/images/plus.gif';
            clicky.alt = '+';
            return false;
        }

        // get the enclosed link (is always the first one)
        var link = listitem.getElementsByTagName('a')[0];

        // prepare an AJAX call to fetch the subtree
        var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        //prepare the new ul
        var ul = document.createElement('ul');
        listitem.appendChild(ul);
        ajax.elementObj = ul;
        ajax.runAJAX(link.search.substr(1)+'&ajax=tree');
        clicky.src = DOKU_BASE+'lib/images/minus.gif';
        return false;
    },

    /**
     * Handles all clicks in the tree, dispatching the right action based on the
     * clicked element
     */
    treehandler: function(e){
        if(e.target.src){ // is it an image?
            acl.treetoggle(e.target);
        } else if(e.target.href){ // is it a link?
            // remove highlighting
            var obj = getElementsByClass('cur',$('acl__tree'),'a');
            for(var i=0; i<obj.length; i++){
                obj[i].className = obj[i].className.replace(/ cur/,'');
            }

            // add new highlighting
            e.target.className += ' cur';

            // set new page to detail form
            var frm = $('acl__detail').getElementsByTagName('form')[0];
            if(e.target.className.search(/wikilink1/) > -1){
                frm.elements['ns'].value = '';
                frm.elements['id'].value = acl.hsc(acl.parseatt(e.target.search)['id']);
            }else if(e.target.className.search(/idx_dir/) > -1){
                frm.elements['ns'].value = acl.hsc(acl.parseatt(e.target.search)['ns']);
                frm.elements['id'].value = '';
            }

            acl.loadinfo();
        }

        e.stopPropagation();
        e.preventDefault();
        return false;
    }

};

addInitEvent(acl.init);


/* XXXXXXXXXX end of lib/plugins/acl/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/revert/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/revert/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/lightbox/script.js XXXXXXXXXX */

var Prototype={Version:"1.6.0.2",Browser:{IE:!!(window.attachEvent&&!window.opera),Opera:!!window.opera,WebKit:navigator.userAgent.indexOf("AppleWebKit/")>-1||navigator.userAgent.indexOf("KHTML")>-1,Gecko:navigator.userAgent.indexOf("Gecko")>-1&&navigator.userAgent.indexOf("KHTML")==-1,MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)},BrowserFeatures:{XPath:!!document.evaluate,ElementExtensions:!!window.HTMLElement,SpecificElementExtensions:document.createElement("div").__proto__&&document.createElement("div").__proto__!==document.createElement("form").__proto__},ScriptFragment:"<script[^>]*>([\\S\\s]*?)</script>",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(x){return x;}};if(Prototype.Browser.MobileSafari){Prototype.BrowserFeatures.SpecificElementExtensions=false;}var Class={create:function(){var _2=null,_3=$A(arguments);if(Object.isFunction(_3[0])){_2=_3.shift();}function klass(){this.initialize.apply(this,arguments);}Object.extend(klass,Class.Methods);klass.superclass=_2;klass.subclasses=[];if(_2){var _4=function(){};_4.prototype=_2.prototype;klass.prototype=new _4;_2.subclasses.push(klass);}for(var i=0;i<_3.length;i++){klass.addMethods(_3[i]);}if(!klass.prototype.initialize){klass.prototype.initialize=Prototype.emptyFunction;}klass.prototype.constructor=klass;return klass;}};Class.Methods={addMethods:function(_6){var _7=this.superclass&&this.superclass.prototype;var _8=Object.keys(_6);if(!Object.keys({toString:true}).length){_8.push("toString","valueOf");}for(var i=0,_a=_8.length;i<_a;i++){var _b=_8[i],_c=_6[_b];if(_7&&Object.isFunction(_c)&&_c.argumentNames().first()=="$super"){var _d=_c,_c=Object.extend((function(m){return function(){return _7[m].apply(this,arguments);};})(_b).wrap(_d),{valueOf:function(){return _d;},toString:function(){return _d.toString();}});}this.prototype[_b]=_c;}return this;}};var Abstract={};Object.extend=function(_f,_10){for(var _11 in _10){_f[_11]=_10[_11];}return _f;};Object.extend(Object,{inspect:function(_12){try{if(Object.isUndefined(_12)){return "undefined";}if(_12===null){return "null";}return _12.inspect?_12.inspect():String(_12);}catch(e){if(e instanceof RangeError){return "...";}throw e;}},toJSON:function(_13){var _14=typeof _13;switch(_14){case "undefined":case "function":case "unknown":return;case "boolean":return _13.toString();}if(_13===null){return "null";}if(_13.toJSON){return _13.toJSON();}if(Object.isElement(_13)){return;}var _15=[];for(var _16 in _13){var _17=Object.toJSON(_13[_16]);if(!Object.isUndefined(_17)){_15.push(_16.toJSON()+": "+_17);}}return "{"+_15.join(", ")+"}";},toQueryString:function(_18){return $H(_18).toQueryString();},toHTML:function(_19){return _19&&_19.toHTML?_19.toHTML():String.interpret(_19);},keys:function(_1a){var _1b=[];for(var _1c in _1a){_1b.push(_1c);}return _1b;},values:function(_1d){var _1e=[];for(var _1f in _1d){_1e.push(_1d[_1f]);}return _1e;},clone:function(_20){return Object.extend({},_20);},isElement:function(_21){return _21&&_21.nodeType==1;},isArray:function(_22){return _22!=null&&typeof _22=="object"&&"splice" in _22&&"join" in _22;},isHash:function(_23){return _23 instanceof Hash;},isFunction:function(_24){return typeof _24=="function";},isString:function(_25){return typeof _25=="string";},isNumber:function(_26){return typeof _26=="number";},isUndefined:function(_27){return typeof _27=="undefined";}});Object.extend(Function.prototype,{argumentNames:function(){var _28=this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");return _28.length==1&&!_28[0]?[]:_28;},bind:function(){if(arguments.length<2&&Object.isUndefined(arguments[0])){return this;}var _29=this,_2a=$A(arguments),_2b=_2a.shift();return function(){return _29.apply(_2b,_2a.concat($A(arguments)));};},bindAsEventListener:function(){var _2c=this,_2d=$A(arguments),_2e=_2d.shift();return function(_2f){return _2c.apply(_2e,[_2f||window.event].concat(_2d));};},curry:function(){if(!arguments.length){return this;}var _30=this,_31=$A(arguments);return function(){return _30.apply(this,_31.concat($A(arguments)));};},delay:function(){var _32=this,_33=$A(arguments),_34=_33.shift()*1000;return window.setTimeout(function(){return _32.apply(_32,_33);},_34);},wrap:function(_35){var _36=this;return function(){return _35.apply(this,[_36.bind(this)].concat($A(arguments)));};},methodize:function(){if(this._methodized){return this._methodized;}var _37=this;return this._methodized=function(){return _37.apply(null,[this].concat($A(arguments)));};}});Function.prototype.defer=Function.prototype.delay.curry(0.01);Date.prototype.toJSON=function(){return "\""+this.getUTCFullYear()+"-"+(this.getUTCMonth()+1).toPaddedString(2)+"-"+this.getUTCDate().toPaddedString(2)+"T"+this.getUTCHours().toPaddedString(2)+":"+this.getUTCMinutes().toPaddedString(2)+":"+this.getUTCSeconds().toPaddedString(2)+"Z\"";};var Try={these:function(){var _38;for(var i=0,_3a=arguments.length;i<_3a;i++){var _3b=arguments[i];try{_38=_3b();break;}catch(e){}}return _38;}};RegExp.prototype.match=RegExp.prototype.test;RegExp.escape=function(str){return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1");};var PeriodicalExecuter=Class.create({initialize:function(_3d,_3e){this.callback=_3d;this.frequency=_3e;this.currentlyExecuting=false;this.registerCallback();},registerCallback:function(){this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},execute:function(){this.callback(this);},stop:function(){if(!this.timer){return;}clearInterval(this.timer);this.timer=null;},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.execute();}finally{this.currentlyExecuting=false;}}}});Object.extend(String,{interpret:function(_3f){return _3f==null?"":String(_3f);},specialChar:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"}});Object.extend(String.prototype,{gsub:function(_40,_41){var _42="",_43=this,_44;_41=arguments.callee.prepareReplacement(_41);while(_43.length>0){if(_44=_43.match(_40)){_42+=_43.slice(0,_44.index);_42+=String.interpret(_41(_44));_43=_43.slice(_44.index+_44[0].length);}else{_42+=_43,_43="";}}return _42;},sub:function(_45,_46,_47){_46=this.gsub.prepareReplacement(_46);_47=Object.isUndefined(_47)?1:_47;return this.gsub(_45,function(_48){if(--_47<0){return _48[0];}return _46(_48);});},scan:function(_49,_4a){this.gsub(_49,_4a);return String(this);},truncate:function(_4b,_4c){_4b=_4b||30;_4c=Object.isUndefined(_4c)?"...":_4c;return this.length>_4b?this.slice(0,_4b-_4c.length)+_4c:String(this);},strip:function(){return this.replace(/^\s+/,"").replace(/\s+$/,"");},stripTags:function(){return this.replace(/<\/?[^>]+>/gi,"");},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"");},extractScripts:function(){var _4d=new RegExp(Prototype.ScriptFragment,"img");var _4e=new RegExp(Prototype.ScriptFragment,"im");return (this.match(_4d)||[]).map(function(_4f){return (_4f.match(_4e)||["",""])[1];});},evalScripts:function(){return this.extractScripts().map(function(_50){return eval(_50);});},escapeHTML:function(){var _51=arguments.callee;_51.text.data=this;return _51.div.innerHTML;},unescapeHTML:function(){var div=new Element("div");div.innerHTML=this.stripTags();return div.childNodes[0]?(div.childNodes.length>1?$A(div.childNodes).inject("",function(_53,_54){return _53+_54.nodeValue;}):div.childNodes[0].nodeValue):"";},toQueryParams:function(_55){var _56=this.strip().match(/([^?#]*)(#.*)?$/);if(!_56){return {};}return _56[1].split(_55||"&").inject({},function(_57,_58){if((_58=_58.split("="))[0]){var key=decodeURIComponent(_58.shift());var _5a=_58.length>1?_58.join("="):_58[0];if(_5a!=undefined){_5a=decodeURIComponent(_5a);}if(key in _57){if(!Object.isArray(_57[key])){_57[key]=[_57[key]];}_57[key].push(_5a);}else{_57[key]=_5a;}}return _57;});},toArray:function(){return this.split("");},succ:function(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1);},times:function(_5b){return _5b<1?"":new Array(_5b+1).join(this);},camelize:function(){var _5c=this.split("-"),len=_5c.length;if(len==1){return _5c[0];}var _5e=this.charAt(0)=="-"?_5c[0].charAt(0).toUpperCase()+_5c[0].substring(1):_5c[0];for(var i=1;i<len;i++){_5e+=_5c[i].charAt(0).toUpperCase()+_5c[i].substring(1);}return _5e;},capitalize:function(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase();},underscore:function(){return this.gsub(/::/,"/").gsub(/([A-Z]+)([A-Z][a-z])/,"#{1}_#{2}").gsub(/([a-z\d])([A-Z])/,"#{1}_#{2}").gsub(/-/,"_").toLowerCase();},dasherize:function(){return this.gsub(/_/,"-");},inspect:function(_60){var _61=this.gsub(/[\x00-\x1f\\]/,function(_62){var _63=String.specialChar[_62[0]];return _63?_63:"\\u00"+_62[0].charCodeAt().toPaddedString(2,16);});if(_60){return "\""+_61.replace(/"/g,"\\\"")+"\"";}return "'"+_61.replace(/'/g,"\\'")+"'";},toJSON:function(){return this.inspect(true);},unfilterJSON:function(_64){return this.sub(_64||Prototype.JSONFilter,"#{1}");},isJSON:function(){var str=this;if(str.blank()){return false;}str=this.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,"");return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);},evalJSON:function(_66){var _67=this.unfilterJSON();try{if(!_66||_67.isJSON()){return eval("("+_67+")");}}catch(e){}throw new SyntaxError("Badly formed JSON string: "+this.inspect());},include:function(_68){return this.indexOf(_68)>-1;},startsWith:function(_69){return this.indexOf(_69)===0;},endsWith:function(_6a){var d=this.length-_6a.length;return d>=0&&this.lastIndexOf(_6a)===d;},empty:function(){return this=="";},blank:function(){return /^\s*$/.test(this);},interpolate:function(_6c,_6d){return new Template(this,_6d).evaluate(_6c);}});if(Prototype.Browser.WebKit||Prototype.Browser.IE){Object.extend(String.prototype,{escapeHTML:function(){return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");},unescapeHTML:function(){return this.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");}});}String.prototype.gsub.prepareReplacement=function(_6e){if(Object.isFunction(_6e)){return _6e;}var _6f=new Template(_6e);return function(_70){return _6f.evaluate(_70);};};String.prototype.parseQuery=String.prototype.toQueryParams;Object.extend(String.prototype.escapeHTML,{div:document.createElement("div"),text:document.createTextNode("")});with(String.prototype.escapeHTML){div.appendChild(text);}var Template=Class.create({initialize:function(_71,_72){this.template=_71.toString();this.pattern=_72||Template.Pattern;},evaluate:function(_73){if(Object.isFunction(_73.toTemplateReplacements)){_73=_73.toTemplateReplacements();}return this.template.gsub(this.pattern,function(_74){if(_73==null){return "";}var _75=_74[1]||"";if(_75=="\\"){return _74[2];}var ctx=_73,_77=_74[3];var _78=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;_74=_78.exec(_77);if(_74==null){return _75;}while(_74!=null){var _79=_74[1].startsWith("[")?_74[2].gsub("\\\\]","]"):_74[1];ctx=ctx[_79];if(null==ctx||""==_74[3]){break;}_77=_77.substring("["==_74[3]?_74[1].length:_74[0].length);_74=_78.exec(_77);}return _75+String.interpret(ctx);});}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable={each:function(_7a,_7b){var _7c=0;_7a=_7a.bind(_7b);try{this._each(function(_7d){_7a(_7d,_7c++);});}catch(e){if(e!=$break){throw e;}}return this;},eachSlice:function(_7e,_7f,_80){_7f=_7f?_7f.bind(_80):Prototype.K;var _81=-_7e,_82=[],_83=this.toArray();while((_81+=_7e)<_83.length){_82.push(_83.slice(_81,_81+_7e));}return _82.collect(_7f,_80);},all:function(_84,_85){_84=_84?_84.bind(_85):Prototype.K;var _86=true;this.each(function(_87,_88){_86=_86&&!!_84(_87,_88);if(!_86){throw $break;}});return _86;},any:function(_89,_8a){_89=_89?_89.bind(_8a):Prototype.K;var _8b=false;this.each(function(_8c,_8d){if(_8b=!!_89(_8c,_8d)){throw $break;}});return _8b;},collect:function(_8e,_8f){_8e=_8e?_8e.bind(_8f):Prototype.K;var _90=[];this.each(function(_91,_92){_90.push(_8e(_91,_92));});return _90;},detect:function(_93,_94){_93=_93.bind(_94);var _95;this.each(function(_96,_97){if(_93(_96,_97)){_95=_96;throw $break;}});return _95;},findAll:function(_98,_99){_98=_98.bind(_99);var _9a=[];this.each(function(_9b,_9c){if(_98(_9b,_9c)){_9a.push(_9b);}});return _9a;},grep:function(_9d,_9e,_9f){_9e=_9e?_9e.bind(_9f):Prototype.K;var _a0=[];if(Object.isString(_9d)){_9d=new RegExp(_9d);}this.each(function(_a1,_a2){if(_9d.match(_a1)){_a0.push(_9e(_a1,_a2));}});return _a0;},include:function(_a3){if(Object.isFunction(this.indexOf)){if(this.indexOf(_a3)!=-1){return true;}}var _a4=false;this.each(function(_a5){if(_a5==_a3){_a4=true;throw $break;}});return _a4;},inGroupsOf:function(_a6,_a7){_a7=Object.isUndefined(_a7)?null:_a7;return this.eachSlice(_a6,function(_a8){while(_a8.length<_a6){_a8.push(_a7);}return _a8;});},inject:function(_a9,_aa,_ab){_aa=_aa.bind(_ab);this.each(function(_ac,_ad){_a9=_aa(_a9,_ac,_ad);});return _a9;},invoke:function(_ae){var _af=$A(arguments).slice(1);return this.map(function(_b0){return _b0[_ae].apply(_b0,_af);});},max:function(_b1,_b2){_b1=_b1?_b1.bind(_b2):Prototype.K;var _b3;this.each(function(_b4,_b5){_b4=_b1(_b4,_b5);if(_b3==null||_b4>=_b3){_b3=_b4;}});return _b3;},min:function(_b6,_b7){_b6=_b6?_b6.bind(_b7):Prototype.K;var _b8;this.each(function(_b9,_ba){_b9=_b6(_b9,_ba);if(_b8==null||_b9<_b8){_b8=_b9;}});return _b8;},partition:function(_bb,_bc){_bb=_bb?_bb.bind(_bc):Prototype.K;var _bd=[],_be=[];this.each(function(_bf,_c0){(_bb(_bf,_c0)?_bd:_be).push(_bf);});return [_bd,_be];},pluck:function(_c1){var _c2=[];this.each(function(_c3){_c2.push(_c3[_c1]);});return _c2;},reject:function(_c4,_c5){_c4=_c4.bind(_c5);var _c6=[];this.each(function(_c7,_c8){if(!_c4(_c7,_c8)){_c6.push(_c7);}});return _c6;},sortBy:function(_c9,_ca){_c9=_c9.bind(_ca);return this.map(function(_cb,_cc){return {value:_cb,criteria:_c9(_cb,_cc)};}).sort(function(_cd,_ce){var a=_cd.criteria,b=_ce.criteria;return a<b?-1:a>b?1:0;}).pluck("value");},toArray:function(){return this.map();},zip:function(){var _d1=Prototype.K,_d2=$A(arguments);if(Object.isFunction(_d2.last())){_d1=_d2.pop();}var _d3=[this].concat(_d2).map($A);return this.map(function(_d4,_d5){return _d1(_d3.pluck(_d5));});},size:function(){return this.toArray().length;},inspect:function(){return "#<Enumerable:"+this.toArray().inspect()+">";}};Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,filter:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray,every:Enumerable.all,some:Enumerable.any});function $A(_d6){if(!_d6){return [];}if(_d6.toArray){return _d6.toArray();}var _d7=_d6.length||0,_d8=new Array(_d7);while(_d7--){_d8[_d7]=_d6[_d7];}return _d8;}if(Prototype.Browser.WebKit){$A=function(_d9){if(!_d9){return [];}if(!(Object.isFunction(_d9)&&_d9=="[object NodeList]")&&_d9.toArray){return _d9.toArray();}var _da=_d9.length||0,_db=new Array(_da);while(_da--){_db[_da]=_d9[_da];}return _db;};}Array.from=$A;Object.extend(Array.prototype,Enumerable);if(!Array.prototype._reverse){Array.prototype._reverse=Array.prototype.reverse;}Object.extend(Array.prototype,{_each:function(_dc){for(var i=0,_de=this.length;i<_de;i++){_dc(this[i]);}},clear:function(){this.length=0;return this;},first:function(){return this[0];},last:function(){return this[this.length-1];},compact:function(){return this.select(function(_df){return _df!=null;});},flatten:function(){return this.inject([],function(_e0,_e1){return _e0.concat(Object.isArray(_e1)?_e1.flatten():[_e1]);});},without:function(){var _e2=$A(arguments);return this.select(function(_e3){return !_e2.include(_e3);});},reverse:function(_e4){return (_e4!==false?this:this.toArray())._reverse();},reduce:function(){return this.length>1?this:this[0];},uniq:function(_e5){return this.inject([],function(_e6,_e7,_e8){if(0==_e8||(_e5?_e6.last()!=_e7:!_e6.include(_e7))){_e6.push(_e7);}return _e6;});},intersect:function(_e9){return this.uniq().findAll(function(_ea){return _e9.detect(function(_eb){return _ea===_eb;});});},clone:function(){return [].concat(this);},size:function(){return this.length;},inspect:function(){return "["+this.map(Object.inspect).join(", ")+"]";},toJSON:function(){var _ec=[];this.each(function(_ed){var _ee=Object.toJSON(_ed);if(!Object.isUndefined(_ee)){_ec.push(_ee);}});return "["+_ec.join(", ")+"]";}});if(Object.isFunction(Array.prototype.forEach)){Array.prototype._each=Array.prototype.forEach;}if(!Array.prototype.indexOf){Array.prototype.indexOf=function(_ef,i){i||(i=0);var _f1=this.length;if(i<0){i=_f1+i;}for(;i<_f1;i++){if(this[i]===_ef){return i;}}return -1;};}if(!Array.prototype.lastIndexOf){Array.prototype.lastIndexOf=function(_f2,i){i=isNaN(i)?this.length:(i<0?this.length+i:i)+1;var n=this.slice(0,i).reverse().indexOf(_f2);return (n<0)?n:i-n-1;};}Array.prototype.toArray=Array.prototype.clone;function $w(_f5){if(!Object.isString(_f5)){return [];}_f5=_f5.strip();return _f5?_f5.split(/\s+/):[];}if(Prototype.Browser.Opera){Array.prototype.concat=function(){var _f6=[];for(var i=0,_f8=this.length;i<_f8;i++){_f6.push(this[i]);}for(var i=0,_f8=arguments.length;i<_f8;i++){if(Object.isArray(arguments[i])){for(var j=0,_fa=arguments[i].length;j<_fa;j++){_f6.push(arguments[i][j]);}}else{_f6.push(arguments[i]);}}return _f6;};}Object.extend(Number.prototype,{toColorPart:function(){return this.toPaddedString(2,16);},succ:function(){return this+1;},times:function(_fb){$R(0,this,true).each(_fb);return this;},toPaddedString:function(_fc,_fd){var _fe=this.toString(_fd||10);return "0".times(_fc-_fe.length)+_fe;},toJSON:function(){return isFinite(this)?this.toString():"null";}});$w("abs round ceil floor").each(function(_ff){Number.prototype[_ff]=Math[_ff].methodize();});function $H(_100){return new Hash(_100);}var Hash=Class.create(Enumerable,(function(){function toQueryPair(key,_102){if(Object.isUndefined(_102)){return key;}return key+"="+encodeURIComponent(String.interpret(_102));}return {initialize:function(_103){this._object=Object.isHash(_103)?_103.toObject():Object.clone(_103);},_each:function(_104){for(var key in this._object){var _106=this._object[key],pair=[key,_106];pair.key=key;pair.value=_106;_104(pair);}},set:function(key,_109){return this._object[key]=_109;},get:function(key){return this._object[key];},unset:function(key){var _10c=this._object[key];delete this._object[key];return _10c;},toObject:function(){return Object.clone(this._object);},keys:function(){return this.pluck("key");},values:function(){return this.pluck("value");},index:function(_10d){var _10e=this.detect(function(pair){return pair.value===_10d;});return _10e&&_10e.key;},merge:function(_110){return this.clone().update(_110);},update:function(_111){return new Hash(_111).inject(this,function(_112,pair){_112.set(pair.key,pair.value);return _112;});},toQueryString:function(){return this.map(function(pair){var key=encodeURIComponent(pair.key),_116=pair.value;if(_116&&typeof _116=="object"){if(Object.isArray(_116)){return _116.map(toQueryPair.curry(key)).join("&");}}return toQueryPair(key,_116);}).join("&");},inspect:function(){return "#<Hash:{"+this.map(function(pair){return pair.map(Object.inspect).join(": ");}).join(", ")+"}>";},toJSON:function(){return Object.toJSON(this.toObject());},clone:function(){return new Hash(this);}};})());Hash.prototype.toTemplateReplacements=Hash.prototype.toObject;Hash.from=$H;var ObjectRange=Class.create(Enumerable,{initialize:function(_118,end,_11a){this.start=_118;this.end=end;this.exclusive=_11a;},_each:function(_11b){var _11c=this.start;while(this.include(_11c)){_11b(_11c);_11c=_11c.succ();}},include:function(_11d){if(_11d<this.start){return false;}if(this.exclusive){return _11d<this.end;}return _11d<=this.end;}});var $R=function(_11e,end,_120){return new ObjectRange(_11e,end,_120);};var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest();},function(){return new ActiveXObject("Msxml2.XMLHTTP");},function(){return new ActiveXObject("Microsoft.XMLHTTP");})||false;},activeRequestCount:0};Ajax.Responders={responders:[],_each:function(_121){this.responders._each(_121);},register:function(_122){if(!this.include(_122)){this.responders.push(_122);}},unregister:function(_123){this.responders=this.responders.without(_123);},dispatch:function(_124,_125,_126,json){this.each(function(_128){if(Object.isFunction(_128[_124])){try{_128[_124].apply(_128,[_125,_126,json]);}catch(e){}}});}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++;},onComplete:function(){Ajax.activeRequestCount--;}});Ajax.Base=Class.create({initialize:function(_129){this.options={method:"post",asynchronous:true,contentType:"application/x-www-form-urlencoded",encoding:"UTF-8",parameters:"",evalJSON:true,evalJS:true};Object.extend(this.options,_129||{});this.options.method=this.options.method.toLowerCase();if(Object.isString(this.options.parameters)){this.options.parameters=this.options.parameters.toQueryParams();}else{if(Object.isHash(this.options.parameters)){this.options.parameters=this.options.parameters.toObject();}}}});Ajax.Request=Class.create(Ajax.Base,{_complete:false,initialize:function(_12a,url,_12c){_12a(_12c);this.transport=Ajax.getTransport();this.request(url);},request:function(url){this.url=url;this.method=this.options.method;var _12e=Object.clone(this.options.parameters);if(!["get","post"].include(this.method)){_12e["_method"]=this.method;this.method="post";}this.parameters=_12e;if(_12e=Object.toQueryString(_12e)){if(this.method=="get"){this.url+=(this.url.include("?")?"&":"?")+_12e;}else{if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){_12e+="&_=";}}}try{var _12f=new Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(_12f);}Ajax.Responders.dispatch("onCreate",this,_12f);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous){this.respondToReadyState.bind(this).defer(1);}this.transport.onreadystatechange=this.onStateChange.bind(this);this.setRequestHeaders();this.body=this.method=="post"?(this.options.postBody||_12e):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange();}}catch(e){this.dispatchException(e);}},onStateChange:function(){var _130=this.transport.readyState;if(_130>1&&!((_130==4)&&this._complete)){this.respondToReadyState(this.transport.readyState);}},setRequestHeaders:function(){var _131={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,"Accept":"text/javascript, text/html, application/xml, text/xml, */*"};if(this.method=="post"){_131["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){_131["Connection"]="close";}}if(typeof this.options.requestHeaders=="object"){var _132=this.options.requestHeaders;if(Object.isFunction(_132.push)){for(var i=0,_134=_132.length;i<_134;i+=2){_131[_132[i]]=_132[i+1];}}else{$H(_132).each(function(pair){_131[pair.key]=pair.value;});}}for(var name in _131){this.transport.setRequestHeader(name,_131[name]);}},success:function(){var _137=this.getStatus();return !_137||(_137>=200&&_137<300);},getStatus:function(){try{return this.transport.status||0;}catch(e){return 0;}},respondToReadyState:function(_138){var _139=Ajax.Request.Events[_138],_13a=new Ajax.Response(this);if(_139=="Complete"){try{this._complete=true;(this.options["on"+_13a.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(_13a,_13a.headerJSON);}catch(e){this.dispatchException(e);}var _13b=_13a.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&_13b&&_13b.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse();}}try{(this.options["on"+_139]||Prototype.emptyFunction)(_13a,_13a.headerJSON);Ajax.Responders.dispatch("on"+_139,this,_13a,_13a.headerJSON);}catch(e){this.dispatchException(e);}if(_139=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction;}},isSameOrigin:function(){var m=this.url.match(/^\s*https?:\/\/[^\/]*/);return !m||(m[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""}));},getHeader:function(name){try{return this.transport.getResponseHeader(name)||null;}catch(e){return null;}},evalResponse:function(){try{return eval((this.transport.responseText||"").unfilterJSON());}catch(e){this.dispatchException(e);}},dispatchException:function(_13e){(this.options.onException||Prototype.emptyFunction)(this,_13e);Ajax.Responders.dispatch("onException",this,_13e);}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Response=Class.create({initialize:function(_13f){this.request=_13f;var _140=this.transport=_13f.transport,_141=this.readyState=_140.readyState;if((_141>2&&!Prototype.Browser.IE)||_141==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(_140.responseText);this.headerJSON=this._getHeaderJSON();}if(_141==4){var xml=_140.responseXML;this.responseXML=Object.isUndefined(xml)?null:xml;this.responseJSON=this._getResponseJSON();}},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||"";}catch(e){return "";}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders();}catch(e){return null;}},getResponseHeader:function(name){return this.transport.getResponseHeader(name);},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders();},_getHeaderJSON:function(){var json=this.getHeader("X-JSON");if(!json){return null;}json=decodeURIComponent(escape(json));try{return json.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin());}catch(e){this.request.dispatchException(e);}},_getResponseJSON:function(){var _145=this.request.options;if(!_145.evalJSON||(_145.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){return null;}try{return this.responseText.evalJSON(_145.sanitizeJSON||!this.request.isSameOrigin());}catch(e){this.request.dispatchException(e);}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function(_146,_147,url,_149){this.container={success:(_147.success||_147),failure:(_147.failure||(_147.success?null:_147))};_149=Object.clone(_149);var _14a=_149.onComplete;_149.onComplete=(function(_14b,json){this.updateContent(_14b.responseText);if(Object.isFunction(_14a)){_14a(_14b,json);}}).bind(this);_146(url,_149);},updateContent:function(_14d){var _14e=this.container[this.success()?"success":"failure"],_14f=this.options;if(!_14f.evalScripts){_14d=_14d.stripScripts();}if(_14e=$(_14e)){if(_14f.insertion){if(Object.isString(_14f.insertion)){var _150={};_150[_14f.insertion]=_14d;_14e.insert(_150);}else{_14f.insertion(_14e,_14d);}}else{_14e.update(_14d);}}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function(_151,_152,url,_154){_151(_154);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=_152;this.url=url;this.start();},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent();},stop:function(){this.updater.options.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments);},updateComplete:function(_155){if(this.options.decay){this.decay=(_155.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=_155.responseText;}this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency);},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options);}});function $(_156){if(arguments.length>1){for(var i=0,_158=[],_159=arguments.length;i<_159;i++){_158.push($(arguments[i]));}return _158;}if(Object.isString(_156)){_156=document.getElementById(_156);}return Element.extend(_156);}if(Prototype.BrowserFeatures.XPath){document._getElementsByXPath=function(_15a,_15b){var _15c=[];var _15d=document.evaluate(_15a,$(_15b)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);for(var i=0,_15f=_15d.snapshotLength;i<_15f;i++){_15c.push(Element.extend(_15d.snapshotItem(i)));}return _15c;};}if(!window.Node){var Node={};}if(!Node.ELEMENT_NODE){Object.extend(Node,{ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12});}(function(){var _160=this.Element;this.Element=function(_161,_162){_162=_162||{};_161=_161.toLowerCase();var _163=Element.cache;if(Prototype.Browser.IE&&_162.name){_161="<"+_161+" name=\""+_162.name+"\">";delete _162.name;return Element.writeAttribute(document.createElement(_161),_162);}if(!_163[_161]){_163[_161]=Element.extend(document.createElement(_161));}return Element.writeAttribute(_163[_161].cloneNode(false),_162);};Object.extend(this.Element,_160||{});}).call(window);Element.cache={};Element.Methods={visible:function(_164){return $(_164).style.display!="none";},toggle:function(_165){_165=$(_165);Element[Element.visible(_165)?"hide":"show"](_165);return _165;},hide:function(_166){$(_166).style.display="none";return _166;},show:function(_167){$(_167).style.display="";return _167;},remove:function(_168){_168=$(_168);_168.parentNode.removeChild(_168);return _168;},update:function(_169,_16a){_169=$(_169);if(_16a&&_16a.toElement){_16a=_16a.toElement();}if(Object.isElement(_16a)){return _169.update().insert(_16a);}_16a=Object.toHTML(_16a);_169.innerHTML=_16a.stripScripts();_16a.evalScripts.bind(_16a).defer();return _169;},replace:function(_16b,_16c){_16b=$(_16b);if(_16c&&_16c.toElement){_16c=_16c.toElement();}else{if(!Object.isElement(_16c)){_16c=Object.toHTML(_16c);var _16d=_16b.ownerDocument.createRange();_16d.selectNode(_16b);_16c.evalScripts.bind(_16c).defer();_16c=_16d.createContextualFragment(_16c.stripScripts());}}_16b.parentNode.replaceChild(_16c,_16b);return _16b;},insert:function(_16e,_16f){_16e=$(_16e);if(Object.isString(_16f)||Object.isNumber(_16f)||Object.isElement(_16f)||(_16f&&(_16f.toElement||_16f.toHTML))){_16f={bottom:_16f};}var _170,_171,_172,_173;for(var _174 in _16f){_170=_16f[_174];_174=_174.toLowerCase();_171=Element._insertionTranslations[_174];if(_170&&_170.toElement){_170=_170.toElement();}if(Object.isElement(_170)){_171(_16e,_170);continue;}_170=Object.toHTML(_170);_172=((_174=="before"||_174=="after")?_16e.parentNode:_16e).tagName.toUpperCase();_173=Element._getContentFromAnonymousElement(_172,_170.stripScripts());if(_174=="top"||_174=="after"){_173.reverse();}_173.each(_171.curry(_16e));_170.evalScripts.bind(_170).defer();}return _16e;},wrap:function(_175,_176,_177){_175=$(_175);if(Object.isElement(_176)){$(_176).writeAttribute(_177||{});}else{if(Object.isString(_176)){_176=new Element(_176,_177);}else{_176=new Element("div",_176);}}if(_175.parentNode){_175.parentNode.replaceChild(_176,_175);}_176.appendChild(_175);return _176;},inspect:function(_178){_178=$(_178);var _179="<"+_178.tagName.toLowerCase();$H({"id":"id","className":"class"}).each(function(pair){var _17b=pair.first(),_17c=pair.last();var _17d=(_178[_17b]||"").toString();if(_17d){_179+=" "+_17c+"="+_17d.inspect(true);}});return _179+">";},recursivelyCollect:function(_17e,_17f){_17e=$(_17e);var _180=[];while(_17e=_17e[_17f]){if(_17e.nodeType==1){_180.push(Element.extend(_17e));}}return _180;},ancestors:function(_181){return $(_181).recursivelyCollect("parentNode");},descendants:function(_182){return $(_182).select("*");},firstDescendant:function(_183){_183=$(_183).firstChild;while(_183&&_183.nodeType!=1){_183=_183.nextSibling;}return $(_183);},immediateDescendants:function(_184){if(!(_184=$(_184).firstChild)){return [];}while(_184&&_184.nodeType!=1){_184=_184.nextSibling;}if(_184){return [_184].concat($(_184).nextSiblings());}return [];},previousSiblings:function(_185){return $(_185).recursivelyCollect("previousSibling");},nextSiblings:function(_186){return $(_186).recursivelyCollect("nextSibling");},siblings:function(_187){_187=$(_187);return _187.previousSiblings().reverse().concat(_187.nextSiblings());},match:function(_188,_189){if(Object.isString(_189)){_189=new Selector(_189);}return _189.match($(_188));},up:function(_18a,_18b,_18c){_18a=$(_18a);if(arguments.length==1){return $(_18a.parentNode);}var _18d=_18a.ancestors();return Object.isNumber(_18b)?_18d[_18b]:Selector.findElement(_18d,_18b,_18c);},down:function(_18e,_18f,_190){_18e=$(_18e);if(arguments.length==1){return _18e.firstDescendant();}return Object.isNumber(_18f)?_18e.descendants()[_18f]:_18e.select(_18f)[_190||0];},previous:function(_191,_192,_193){_191=$(_191);if(arguments.length==1){return $(Selector.handlers.previousElementSibling(_191));}var _194=_191.previousSiblings();return Object.isNumber(_192)?_194[_192]:Selector.findElement(_194,_192,_193);},next:function(_195,_196,_197){_195=$(_195);if(arguments.length==1){return $(Selector.handlers.nextElementSibling(_195));}var _198=_195.nextSiblings();return Object.isNumber(_196)?_198[_196]:Selector.findElement(_198,_196,_197);},select:function(){var args=$A(arguments),_19a=$(args.shift());return Selector.findChildElements(_19a,args);},adjacent:function(){var args=$A(arguments),_19c=$(args.shift());return Selector.findChildElements(_19c.parentNode,args).without(_19c);},identify:function(_19d){_19d=$(_19d);var id=_19d.readAttribute("id"),self=arguments.callee;if(id){return id;}do{id="anonymous_element_"+self.counter++;}while($(id));_19d.writeAttribute("id",id);return id;},readAttribute:function(_1a0,name){_1a0=$(_1a0);if(Prototype.Browser.IE){var t=Element._attributeTranslations.read;if(t.values[name]){return t.values[name](_1a0,name);}if(t.names[name]){name=t.names[name];}if(name.include(":")){return (!_1a0.attributes||!_1a0.attributes[name])?null:_1a0.attributes[name].value;}}return _1a0.getAttribute(name);},writeAttribute:function(_1a3,name,_1a5){_1a3=$(_1a3);var _1a6={},t=Element._attributeTranslations.write;if(typeof name=="object"){_1a6=name;}else{_1a6[name]=Object.isUndefined(_1a5)?true:_1a5;}for(var attr in _1a6){name=t.names[attr]||attr;_1a5=_1a6[attr];if(t.values[attr]){name=t.values[attr](_1a3,_1a5);}if(_1a5===false||_1a5===null){_1a3.removeAttribute(name);}else{if(_1a5===true){_1a3.setAttribute(name,name);}else{_1a3.setAttribute(name,_1a5);}}}return _1a3;},getHeight:function(_1a9){return $(_1a9).getDimensions().height;},getWidth:function(_1aa){return $(_1aa).getDimensions().width;},classNames:function(_1ab){return new Element.ClassNames(_1ab);},hasClassName:function(_1ac,_1ad){if(!(_1ac=$(_1ac))){return;}var _1ae=_1ac.className;return (_1ae.length>0&&(_1ae==_1ad||new RegExp("(^|\\s)"+_1ad+"(\\s|$)").test(_1ae)));},addClassName:function(_1af,_1b0){if(!(_1af=$(_1af))){return;}if(!_1af.hasClassName(_1b0)){_1af.className+=(_1af.className?" ":"")+_1b0;}return _1af;},removeClassName:function(_1b1,_1b2){if(!(_1b1=$(_1b1))){return;}_1b1.className=_1b1.className.replace(new RegExp("(^|\\s+)"+_1b2+"(\\s+|$)")," ").strip();return _1b1;},toggleClassName:function(_1b3,_1b4){if(!(_1b3=$(_1b3))){return;}return _1b3[_1b3.hasClassName(_1b4)?"removeClassName":"addClassName"](_1b4);},cleanWhitespace:function(_1b5){_1b5=$(_1b5);var node=_1b5.firstChild;while(node){var _1b7=node.nextSibling;if(node.nodeType==3&&!/\S/.test(node.nodeValue)){_1b5.removeChild(node);}node=_1b7;}return _1b5;},empty:function(_1b8){return $(_1b8).innerHTML.blank();},descendantOf:function(_1b9,_1ba){_1b9=$(_1b9),_1ba=$(_1ba);var _1bb=_1ba;if(_1b9.compareDocumentPosition){return (_1b9.compareDocumentPosition(_1ba)&8)===8;}if(_1b9.sourceIndex&&!Prototype.Browser.Opera){var e=_1b9.sourceIndex,a=_1ba.sourceIndex,_1be=_1ba.nextSibling;if(!_1be){do{_1ba=_1ba.parentNode;}while(!(_1be=_1ba.nextSibling)&&_1ba.parentNode);}if(_1be&&_1be.sourceIndex){return (e>a&&e<_1be.sourceIndex);}}while(_1b9=_1b9.parentNode){if(_1b9==_1bb){return true;}}return false;},scrollTo:function(_1bf){_1bf=$(_1bf);var pos=_1bf.cumulativeOffset();window.scrollTo(pos[0],pos[1]);return _1bf;},getStyle:function(_1c1,_1c2){_1c1=$(_1c1);_1c2=_1c2=="float"?"cssFloat":_1c2.camelize();var _1c3=_1c1.style[_1c2];if(!_1c3){var css=document.defaultView.getComputedStyle(_1c1,null);_1c3=css?css[_1c2]:null;}if(_1c2=="opacity"){return _1c3?parseFloat(_1c3):1;}return _1c3=="auto"?null:_1c3;},getOpacity:function(_1c5){return $(_1c5).getStyle("opacity");},setStyle:function(_1c6,_1c7){_1c6=$(_1c6);var _1c8=_1c6.style,_1c9;if(Object.isString(_1c7)){_1c6.style.cssText+=";"+_1c7;return _1c7.include("opacity")?_1c6.setOpacity(_1c7.match(/opacity:\s*(\d?\.?\d*)/)[1]):_1c6;}for(var _1ca in _1c7){if(_1ca=="opacity"){_1c6.setOpacity(_1c7[_1ca]);}else{_1c8[(_1ca=="float"||_1ca=="cssFloat")?(Object.isUndefined(_1c8.styleFloat)?"cssFloat":"styleFloat"):_1ca]=_1c7[_1ca];}}return _1c6;},setOpacity:function(_1cb,_1cc){_1cb=$(_1cb);_1cb.style.opacity=(_1cc==1||_1cc==="")?"":(_1cc<0.00001)?0:_1cc;return _1cb;},getDimensions:function(_1cd){_1cd=$(_1cd);var _1ce=$(_1cd).getStyle("display");if(_1ce!="none"&&_1ce!=null){return {width:_1cd.offsetWidth,height:_1cd.offsetHeight};}var els=_1cd.style;var _1d0=els.visibility;var _1d1=els.position;var _1d2=els.display;els.visibility="hidden";els.position="absolute";els.display="block";var _1d3=_1cd.clientWidth;var _1d4=_1cd.clientHeight;els.display=_1d2;els.position=_1d1;els.visibility=_1d0;return {width:_1d3,height:_1d4};},makePositioned:function(_1d5){_1d5=$(_1d5);var pos=Element.getStyle(_1d5,"position");if(pos=="static"||!pos){_1d5._madePositioned=true;_1d5.style.position="relative";if(window.opera){_1d5.style.top=0;_1d5.style.left=0;}}return _1d5;},undoPositioned:function(_1d7){_1d7=$(_1d7);if(_1d7._madePositioned){_1d7._madePositioned=undefined;_1d7.style.position=_1d7.style.top=_1d7.style.left=_1d7.style.bottom=_1d7.style.right="";}return _1d7;},makeClipping:function(_1d8){_1d8=$(_1d8);if(_1d8._overflow){return _1d8;}_1d8._overflow=Element.getStyle(_1d8,"overflow")||"auto";if(_1d8._overflow!=="hidden"){_1d8.style.overflow="hidden";}return _1d8;},undoClipping:function(_1d9){_1d9=$(_1d9);if(!_1d9._overflow){return _1d9;}_1d9.style.overflow=_1d9._overflow=="auto"?"":_1d9._overflow;_1d9._overflow=null;return _1d9;},cumulativeOffset:function(_1da){var _1db=0,_1dc=0;do{_1db+=_1da.offsetTop||0;_1dc+=_1da.offsetLeft||0;_1da=_1da.offsetParent;}while(_1da);return Element._returnOffset(_1dc,_1db);},positionedOffset:function(_1dd){var _1de=0,_1df=0;do{_1de+=_1dd.offsetTop||0;_1df+=_1dd.offsetLeft||0;_1dd=_1dd.offsetParent;if(_1dd){if(_1dd.tagName=="BODY"){break;}var p=Element.getStyle(_1dd,"position");if(p!=="static"){break;}}}while(_1dd);return Element._returnOffset(_1df,_1de);},absolutize:function(_1e1){_1e1=$(_1e1);if(_1e1.getStyle("position")=="absolute"){return;}var _1e2=_1e1.positionedOffset();var top=_1e2[1];var left=_1e2[0];var _1e5=_1e1.clientWidth;var _1e6=_1e1.clientHeight;_1e1._originalLeft=left-parseFloat(_1e1.style.left||0);_1e1._originalTop=top-parseFloat(_1e1.style.top||0);_1e1._originalWidth=_1e1.style.width;_1e1._originalHeight=_1e1.style.height;_1e1.style.position="absolute";_1e1.style.top=top+"px";_1e1.style.left=left+"px";_1e1.style.width=_1e5+"px";_1e1.style.height=_1e6+"px";return _1e1;},relativize:function(_1e7){_1e7=$(_1e7);if(_1e7.getStyle("position")=="relative"){return;}_1e7.style.position="relative";var top=parseFloat(_1e7.style.top||0)-(_1e7._originalTop||0);var left=parseFloat(_1e7.style.left||0)-(_1e7._originalLeft||0);_1e7.style.top=top+"px";_1e7.style.left=left+"px";_1e7.style.height=_1e7._originalHeight;_1e7.style.width=_1e7._originalWidth;return _1e7;},cumulativeScrollOffset:function(_1ea){var _1eb=0,_1ec=0;do{_1eb+=_1ea.scrollTop||0;_1ec+=_1ea.scrollLeft||0;_1ea=_1ea.parentNode;}while(_1ea);return Element._returnOffset(_1ec,_1eb);},getOffsetParent:function(_1ed){if(_1ed.offsetParent){return $(_1ed.offsetParent);}if(_1ed==document.body){return $(_1ed);}while((_1ed=_1ed.parentNode)&&_1ed!=document.body){if(Element.getStyle(_1ed,"position")!="static"){return $(_1ed);}}return $(document.body);},viewportOffset:function(_1ee){var _1ef=0,_1f0=0;var _1f1=_1ee;do{_1ef+=_1f1.offsetTop||0;_1f0+=_1f1.offsetLeft||0;if(_1f1.offsetParent==document.body&&Element.getStyle(_1f1,"position")=="absolute"){break;}}while(_1f1=_1f1.offsetParent);_1f1=_1ee;do{if(!Prototype.Browser.Opera||_1f1.tagName=="BODY"){_1ef-=_1f1.scrollTop||0;_1f0-=_1f1.scrollLeft||0;}}while(_1f1=_1f1.parentNode);return Element._returnOffset(_1f0,_1ef);},clonePosition:function(_1f2,_1f3){var _1f4=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});_1f3=$(_1f3);var p=_1f3.viewportOffset();_1f2=$(_1f2);var _1f6=[0,0];var _1f7=null;if(Element.getStyle(_1f2,"position")=="absolute"){_1f7=_1f2.getOffsetParent();_1f6=_1f7.viewportOffset();}if(_1f7==document.body){_1f6[0]-=document.body.offsetLeft;_1f6[1]-=document.body.offsetTop;}if(_1f4.setLeft){_1f2.style.left=(p[0]-_1f6[0]+_1f4.offsetLeft)+"px";}if(_1f4.setTop){_1f2.style.top=(p[1]-_1f6[1]+_1f4.offsetTop)+"px";}if(_1f4.setWidth){_1f2.style.width=_1f3.offsetWidth+"px";}if(_1f4.setHeight){_1f2.style.height=_1f3.offsetHeight+"px";}return _1f2;}};Element.Methods.identify.counter=1;Object.extend(Element.Methods,{getElementsBySelector:Element.Methods.select,childElements:Element.Methods.immediateDescendants});Element._attributeTranslations={write:{names:{className:"class",htmlFor:"for"},values:{}}};if(Prototype.Browser.Opera){Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(_1f8,_1f9,_1fa){switch(_1fa){case "left":case "top":case "right":case "bottom":if(_1f8(_1f9,"position")==="static"){return null;}case "height":case "width":if(!Element.visible(_1f9)){return null;}var dim=parseInt(_1f8(_1f9,_1fa),10);if(dim!==_1f9["offset"+_1fa.capitalize()]){return dim+"px";}var _1fc;if(_1fa==="height"){_1fc=["border-top-width","padding-top","padding-bottom","border-bottom-width"];}else{_1fc=["border-left-width","padding-left","padding-right","border-right-width"];}return _1fc.inject(dim,function(memo,_1fe){var val=_1f8(_1f9,_1fe);return val===null?memo:memo-parseInt(val,10);})+"px";default:return _1f8(_1f9,_1fa);}});Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(_200,_201,_202){if(_202==="title"){return _201.title;}return _200(_201,_202);});}else{if(Prototype.Browser.IE){Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(_203,_204){_204=$(_204);var _205=_204.getStyle("position");if(_205!=="static"){return _203(_204);}_204.setStyle({position:"relative"});var _206=_203(_204);_204.setStyle({position:_205});return _206;});$w("positionedOffset viewportOffset").each(function(_207){Element.Methods[_207]=Element.Methods[_207].wrap(function(_208,_209){_209=$(_209);var _20a=_209.getStyle("position");if(_20a!=="static"){return _208(_209);}var _20b=_209.getOffsetParent();if(_20b&&_20b.getStyle("position")==="fixed"){_20b.setStyle({zoom:1});}_209.setStyle({position:"relative"});var _20c=_208(_209);_209.setStyle({position:_20a});return _20c;});});Element.Methods.getStyle=function(_20d,_20e){_20d=$(_20d);_20e=(_20e=="float"||_20e=="cssFloat")?"styleFloat":_20e.camelize();var _20f=_20d.style[_20e];if(!_20f&&_20d.currentStyle){_20f=_20d.currentStyle[_20e];}if(_20e=="opacity"){if(_20f=(_20d.getStyle("filter")||"").match(/alpha\(opacity=(.*)\)/)){if(_20f[1]){return parseFloat(_20f[1])/100;}}return 1;}if(_20f=="auto"){if((_20e=="width"||_20e=="height")&&(_20d.getStyle("display")!="none")){return _20d["offset"+_20e.capitalize()]+"px";}return null;}return _20f;};Element.Methods.setOpacity=function(_210,_211){function stripAlpha(_212){return _212.replace(/alpha\([^\)]*\)/gi,"");}_210=$(_210);var _213=_210.currentStyle;if((_213&&!_213.hasLayout)||(!_213&&_210.style.zoom=="normal")){_210.style.zoom=1;}var _214=_210.getStyle("filter"),_215=_210.style;if(_211==1||_211===""){(_214=stripAlpha(_214))?_215.filter=_214:_215.removeAttribute("filter");return _210;}else{if(_211<0.00001){_211=0;}}_215.filter=stripAlpha(_214)+"alpha(opacity="+(_211*100)+")";return _210;};Element._attributeTranslations={read:{names:{"class":"className","for":"htmlFor"},values:{_getAttr:function(_216,_217){return _216.getAttribute(_217,2);},_getAttrNode:function(_218,_219){var node=_218.getAttributeNode(_219);return node?node.value:"";},_getEv:function(_21b,_21c){_21c=_21b.getAttribute(_21c);return _21c?_21c.toString().slice(23,-2):null;},_flag:function(_21d,_21e){return $(_21d).hasAttribute(_21e)?_21e:null;},style:function(_21f){return _21f.style.cssText.toLowerCase();},title:function(_220){return _220.title;}}}};Element._attributeTranslations.write={names:Object.extend({cellpadding:"cellPadding",cellspacing:"cellSpacing"},Element._attributeTranslations.read.names),values:{checked:function(_221,_222){_221.checked=!!_222;},style:function(_223,_224){_223.style.cssText=_224?_224:"";}}};Element._attributeTranslations.has={};$w("colSpan rowSpan vAlign dateTime accessKey tabIndex "+"encType maxLength readOnly longDesc").each(function(attr){Element._attributeTranslations.write.names[attr.toLowerCase()]=attr;Element._attributeTranslations.has[attr.toLowerCase()]=attr;});(function(v){Object.extend(v,{href:v._getAttr,src:v._getAttr,type:v._getAttr,action:v._getAttrNode,disabled:v._flag,checked:v._flag,readonly:v._flag,multiple:v._flag,onload:v._getEv,onunload:v._getEv,onclick:v._getEv,ondblclick:v._getEv,onmousedown:v._getEv,onmouseup:v._getEv,onmouseover:v._getEv,onmousemove:v._getEv,onmouseout:v._getEv,onfocus:v._getEv,onblur:v._getEv,onkeypress:v._getEv,onkeydown:v._getEv,onkeyup:v._getEv,onsubmit:v._getEv,onreset:v._getEv,onselect:v._getEv,onchange:v._getEv});})(Element._attributeTranslations.read.values);}else{if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){Element.Methods.setOpacity=function(_227,_228){_227=$(_227);_227.style.opacity=(_228==1)?0.999999:(_228==="")?"":(_228<0.00001)?0:_228;return _227;};}else{if(Prototype.Browser.WebKit){Element.Methods.setOpacity=function(_229,_22a){_229=$(_229);_229.style.opacity=(_22a==1||_22a==="")?"":(_22a<0.00001)?0:_22a;if(_22a==1){if(_229.tagName=="IMG"&&_229.width){_229.width++;_229.width--;}else{try{var n=document.createTextNode(" ");_229.appendChild(n);_229.removeChild(n);}catch(e){}}}return _229;};Element.Methods.cumulativeOffset=function(_22c){var _22d=0,_22e=0;do{_22d+=_22c.offsetTop||0;_22e+=_22c.offsetLeft||0;if(_22c.offsetParent==document.body){if(Element.getStyle(_22c,"position")=="absolute"){break;}}_22c=_22c.offsetParent;}while(_22c);return Element._returnOffset(_22e,_22d);};}}}}if(Prototype.Browser.IE||Prototype.Browser.Opera){Element.Methods.update=function(_22f,_230){_22f=$(_22f);if(_230&&_230.toElement){_230=_230.toElement();}if(Object.isElement(_230)){return _22f.update().insert(_230);}_230=Object.toHTML(_230);var _231=_22f.tagName.toUpperCase();if(_231 in Element._insertionTranslations.tags){$A(_22f.childNodes).each(function(node){_22f.removeChild(node);});Element._getContentFromAnonymousElement(_231,_230.stripScripts()).each(function(node){_22f.appendChild(node);});}else{_22f.innerHTML=_230.stripScripts();}_230.evalScripts.bind(_230).defer();return _22f;};}if("outerHTML" in document.createElement("div")){Element.Methods.replace=function(_234,_235){_234=$(_234);if(_235&&_235.toElement){_235=_235.toElement();}if(Object.isElement(_235)){_234.parentNode.replaceChild(_235,_234);return _234;}_235=Object.toHTML(_235);var _236=_234.parentNode,_237=_236.tagName.toUpperCase();if(Element._insertionTranslations.tags[_237]){var _238=_234.next();var _239=Element._getContentFromAnonymousElement(_237,_235.stripScripts());_236.removeChild(_234);if(_238){_239.each(function(node){_236.insertBefore(node,_238);});}else{_239.each(function(node){_236.appendChild(node);});}}else{_234.outerHTML=_235.stripScripts();}_235.evalScripts.bind(_235).defer();return _234;};}Element._returnOffset=function(l,t){var _23e=[l,t];_23e.left=l;_23e.top=t;return _23e;};Element._getContentFromAnonymousElement=function(_23f,html){var div=new Element("div"),t=Element._insertionTranslations.tags[_23f];if(t){div.innerHTML=t[0]+html+t[1];t[2].times(function(){div=div.firstChild;});}else{div.innerHTML=html;}return $A(div.childNodes);};Element._insertionTranslations={before:function(_243,node){_243.parentNode.insertBefore(node,_243);},top:function(_245,node){_245.insertBefore(node,_245.firstChild);},bottom:function(_247,node){_247.appendChild(node);},after:function(_249,node){_249.parentNode.insertBefore(node,_249.nextSibling);},tags:{TABLE:["<table>","</table>",1],TBODY:["<table><tbody>","</tbody></table>",2],TR:["<table><tbody><tr>","</tr></tbody></table>",3],TD:["<table><tbody><tr><td>","</td></tr></tbody></table>",4],SELECT:["<select>","</select>",1]}};(function(){Object.extend(this.tags,{THEAD:this.tags.TBODY,TFOOT:this.tags.TBODY,TH:this.tags.TD});}).call(Element._insertionTranslations);Element.Methods.Simulated={hasAttribute:function(_24b,_24c){_24c=Element._attributeTranslations.has[_24c]||_24c;var node=$(_24b).getAttributeNode(_24c);return node&&node.specified;}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);if(!Prototype.BrowserFeatures.ElementExtensions&&document.createElement("div").__proto__){window.HTMLElement={};window.HTMLElement.prototype=document.createElement("div").__proto__;Prototype.BrowserFeatures.ElementExtensions=true;}Element.extend=(function(){if(Prototype.BrowserFeatures.SpecificElementExtensions){return Prototype.K;}var _24e={},_24f=Element.Methods.ByTag;var _250=Object.extend(function(_251){if(!_251||_251._extendedByPrototype||_251.nodeType!=1||_251==window){return _251;}var _252=Object.clone(_24e),_253=_251.tagName,_254,_255;if(_24f[_253]){Object.extend(_252,_24f[_253]);}for(_254 in _252){_255=_252[_254];if(Object.isFunction(_255)&&!(_254 in _251)){_251[_254]=_255.methodize();}}_251._extendedByPrototype=Prototype.emptyFunction;return _251;},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(_24e,Element.Methods);Object.extend(_24e,Element.Methods.Simulated);}}});_250.refresh();return _250;})();Element.hasAttribute=function(_256,_257){if(_256.hasAttribute){return _256.hasAttribute(_257);}return Element.Methods.Simulated.hasAttribute(_256,_257);};Element.addMethods=function(_258){var F=Prototype.BrowserFeatures,T=Element.Methods.ByTag;if(!_258){Object.extend(Form,Form.Methods);Object.extend(Form.Element,Form.Element.Methods);Object.extend(Element.Methods.ByTag,{"FORM":Object.clone(Form.Methods),"INPUT":Object.clone(Form.Element.Methods),"SELECT":Object.clone(Form.Element.Methods),"TEXTAREA":Object.clone(Form.Element.Methods)});}if(arguments.length==2){var _25b=_258;_258=arguments[1];}if(!_25b){Object.extend(Element.Methods,_258||{});}else{if(Object.isArray(_25b)){_25b.each(extend);}else{extend(_25b);}}function extend(_25c){_25c=_25c.toUpperCase();if(!Element.Methods.ByTag[_25c]){Element.Methods.ByTag[_25c]={};}Object.extend(Element.Methods.ByTag[_25c],_258);}function copy(_25d,_25e,_25f){_25f=_25f||false;for(var _260 in _25d){var _261=_25d[_260];if(!Object.isFunction(_261)){continue;}if(!_25f||!(_260 in _25e)){_25e[_260]=_261.methodize();}}}function findDOMClass(_262){var _263;var _264={"OPTGROUP":"OptGroup","TEXTAREA":"TextArea","P":"Paragraph","FIELDSET":"FieldSet","UL":"UList","OL":"OList","DL":"DList","DIR":"Directory","H1":"Heading","H2":"Heading","H3":"Heading","H4":"Heading","H5":"Heading","H6":"Heading","Q":"Quote","INS":"Mod","DEL":"Mod","A":"Anchor","IMG":"Image","CAPTION":"TableCaption","COL":"TableCol","COLGROUP":"TableCol","THEAD":"TableSection","TFOOT":"TableSection","TBODY":"TableSection","TR":"TableRow","TH":"TableCell","TD":"TableCell","FRAMESET":"FrameSet","IFRAME":"IFrame"};if(_264[_262]){_263="HTML"+_264[_262]+"Element";}if(window[_263]){return window[_263];}_263="HTML"+_262+"Element";if(window[_263]){return window[_263];}_263="HTML"+_262.capitalize()+"Element";if(window[_263]){return window[_263];}window[_263]={};window[_263].prototype=document.createElement(_262).__proto__;return window[_263];}if(F.ElementExtensions){copy(Element.Methods,HTMLElement.prototype);copy(Element.Methods.Simulated,HTMLElement.prototype,true);}if(F.SpecificElementExtensions){for(var tag in Element.Methods.ByTag){var _266=findDOMClass(tag);if(Object.isUndefined(_266)){continue;}copy(T[tag],_266.prototype);}}Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh){Element.extend.refresh();}Element.cache={};};document.viewport={getDimensions:function(){var _267={};var B=Prototype.Browser;$w("width height").each(function(d){var D=d.capitalize();_267[d]=(B.WebKit&&!document.evaluate)?self["inner"+D]:(B.Opera)?document.body["client"+D]:document.documentElement["client"+D];});return _267;},getWidth:function(){return this.getDimensions().width;},getHeight:function(){return this.getDimensions().height;},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop);}};var Selector=Class.create({initialize:function(_26b){this.expression=_26b.strip();this.compileMatcher();},shouldUseXPath:function(){if(!Prototype.BrowserFeatures.XPath){return false;}var e=this.expression;if(Prototype.Browser.WebKit&&(e.include("-of-type")||e.include(":empty"))){return false;}if((/(\[[\w-]*?:|:checked)/).test(this.expression)){return false;}return true;},compileMatcher:function(){if(this.shouldUseXPath()){return this.compileXPathMatcher();}var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m;if(Selector._cache[e]){this.matcher=Selector._cache[e];return;}this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in ps){p=ps[i];if(m=e.match(p)){this.matcher.push(Object.isFunction(c[i])?c[i](m):new Template(c[i]).evaluate(m));e=e.replace(m[0],"");break;}}}this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join("\n"));Selector._cache[this.expression]=this.matcher;},compileXPathMatcher:function(){var e=this.expression,ps=Selector.patterns,x=Selector.xpath,le,m;if(Selector._cache[e]){this.xpath=Selector._cache[e];return;}this.matcher=[".//*"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in ps){if(m=e.match(ps[i])){this.matcher.push(Object.isFunction(x[i])?x[i](m):new Template(x[i]).evaluate(m));e=e.replace(m[0],"");break;}}}this.xpath=this.matcher.join("");Selector._cache[this.expression]=this.xpath;},findElements:function(root){root=root||document;if(this.xpath){return document._getElementsByXPath(this.xpath,root);}return this.matcher(root);},match:function(_27c){this.tokens=[];var e=this.expression,ps=Selector.patterns,as=Selector.assertions;var le,p,m;while(e&&le!==e&&(/\S/).test(e)){le=e;for(var i in ps){p=ps[i];if(m=e.match(p)){if(as[i]){this.tokens.push([i,Object.clone(m)]);e=e.replace(m[0],"");}else{return this.findElements(document).include(_27c);}}}}var _284=true,name,_286;for(var i=0,_287;_287=this.tokens[i];i++){name=_287[0],_286=_287[1];if(!Selector.assertions[name](_27c,_286)){_284=false;break;}}return _284;},toString:function(){return this.expression;},inspect:function(){return "#<Selector:"+this.expression.inspect()+">";}});Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(m){if(m[1]=="*"){return "";}return "[local-name()='"+m[1].toLowerCase()+"' or local-name()='"+m[1].toUpperCase()+"']";},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(m){m[1]=m[1].toLowerCase();return new Template("[@#{1}]").evaluate(m);},attr:function(m){m[1]=m[1].toLowerCase();m[3]=m[5]||m[6];return new Template(Selector.xpath.operators[m[2]]).evaluate(m);},pseudo:function(m){var h=Selector.xpath.pseudos[m[1]];if(!h){return "";}if(Object.isFunction(h)){return h(m);}return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);},operators:{"=":"[@#{1}='#{3}']","!=":"[@#{1}!='#{3}']","^=":"[starts-with(@#{1}, '#{3}')]","$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']","*=":"[contains(@#{1}, '#{3}')]","~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]","|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{"first-child":"[not(preceding-sibling::*)]","last-child":"[not(following-sibling::*)]","only-child":"[not(preceding-sibling::* or following-sibling::*)]","empty":"[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]","checked":"[@checked]","disabled":"[@disabled]","enabled":"[not(@disabled)]","not":function(m){var e=m[6],p=Selector.patterns,x=Selector.xpath,le,v;var _293=[];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in p){if(m=e.match(p[i])){v=Object.isFunction(x[i])?x[i](m):new Template(x[i]).evaluate(m);_293.push("("+v.substring(1,v.length-1)+")");e=e.replace(m[0],"");break;}}}return "[not("+_293.join(" and ")+")]";},"nth-child":function(m){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",m);},"nth-last-child":function(m){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",m);},"nth-of-type":function(m){return Selector.xpath.pseudos.nth("position() ",m);},"nth-last-of-type":function(m){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",m);},"first-of-type":function(m){m[6]="1";return Selector.xpath.pseudos["nth-of-type"](m);},"last-of-type":function(m){m[6]="1";return Selector.xpath.pseudos["nth-last-of-type"](m);},"only-of-type":function(m){var p=Selector.xpath.pseudos;return p["first-of-type"](m)+p["last-of-type"](m);},nth:function(_29d,m){var mm,_2a0=m[6],_2a1;if(_2a0=="even"){_2a0="2n+0";}if(_2a0=="odd"){_2a0="2n+1";}if(mm=_2a0.match(/^(\d+)$/)){return "["+_29d+"= "+mm[1]+"]";}if(mm=_2a0.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(mm[1]=="-"){mm[1]=-1;}var a=mm[1]?Number(mm[1]):1;var b=mm[2]?Number(mm[2]):0;_2a1="[((#{fragment} - #{b}) mod #{a} = 0) and "+"((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(_2a1).evaluate({fragment:_29d,a:a,b:b});}}}},criteria:{tagName:"n = h.tagName(n, r, \"#{1}\", c);      c = false;",className:"n = h.className(n, r, \"#{1}\", c);    c = false;",id:"n = h.id(n, r, \"#{1}\", c);           c = false;",attrPresence:"n = h.attrPresence(n, r, \"#{1}\", c); c = false;",attr:function(m){m[3]=(m[5]||m[6]);return new Template("n = h.attr(n, r, \"#{1}\", \"#{3}\", \"#{2}\", c); c = false;").evaluate(m);},pseudo:function(m){if(m[6]){m[6]=m[6].replace(/"/g,"\\\"");}return new Template("n = h.pseudo(n, \"#{1}\", \"#{6}\", r, c); c = false;").evaluate(m);},descendant:"c = \"descendant\";",child:"c = \"child\";",adjacent:"c = \"adjacent\";",laterSibling:"c = \"laterSibling\";"},patterns:{laterSibling:/^\s*~\s*/,child:/^\s*>\s*/,adjacent:/^\s*\+\s*/,descendant:/^\s/,tagName:/^\s*(\*|[\w\-]+)(\b|$)?/,id:/^#([\w\-\*]+)(\b|$)/,className:/^\.([\w\-\*]+)(\b|$)/,pseudo:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,attrPresence:/^\[([\w]+)\]/,attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*(([\x27"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/},assertions:{tagName:function(_2a6,_2a7){return _2a7[1].toUpperCase()==_2a6.tagName.toUpperCase();},className:function(_2a8,_2a9){return Element.hasClassName(_2a8,_2a9[1]);},id:function(_2aa,_2ab){return _2aa.id===_2ab[1];},attrPresence:function(_2ac,_2ad){return Element.hasAttribute(_2ac,_2ad[1]);},attr:function(_2ae,_2af){var _2b0=Element.readAttribute(_2ae,_2af[1]);return _2b0&&Selector.operators[_2af[2]](_2b0,_2af[5]||_2af[6]);}},handlers:{concat:function(a,b){for(var i=0,node;node=b[i];i++){a.push(node);}return a;},mark:function(_2b5){var _2b6=Prototype.emptyFunction;for(var i=0,node;node=_2b5[i];i++){node._countedByPrototype=_2b6;}return _2b5;},unmark:function(_2b9){for(var i=0,node;node=_2b9[i];i++){node._countedByPrototype=undefined;}return _2b9;},index:function(_2bc,_2bd,_2be){_2bc._countedByPrototype=Prototype.emptyFunction;if(_2bd){for(var _2bf=_2bc.childNodes,i=_2bf.length-1,j=1;i>=0;i--){var node=_2bf[i];if(node.nodeType==1&&(!_2be||node._countedByPrototype)){node.nodeIndex=j++;}}}else{for(var i=0,j=1,_2bf=_2bc.childNodes;node=_2bf[i];i++){if(node.nodeType==1&&(!_2be||node._countedByPrototype)){node.nodeIndex=j++;}}}},unique:function(_2c3){if(_2c3.length==0){return _2c3;}var _2c4=[],n;for(var i=0,l=_2c3.length;i<l;i++){if(!(n=_2c3[i])._countedByPrototype){n._countedByPrototype=Prototype.emptyFunction;_2c4.push(Element.extend(n));}}return Selector.handlers.unmark(_2c4);},descendant:function(_2c8){var h=Selector.handlers;for(var i=0,_2cb=[],node;node=_2c8[i];i++){h.concat(_2cb,node.getElementsByTagName("*"));}return _2cb;},child:function(_2cd){var h=Selector.handlers;for(var i=0,_2d0=[],node;node=_2cd[i];i++){for(var j=0,_2d3;_2d3=node.childNodes[j];j++){if(_2d3.nodeType==1&&_2d3.tagName!="!"){_2d0.push(_2d3);}}}return _2d0;},adjacent:function(_2d4){for(var i=0,_2d6=[],node;node=_2d4[i];i++){var next=this.nextElementSibling(node);if(next){_2d6.push(next);}}return _2d6;},laterSibling:function(_2d9){var h=Selector.handlers;for(var i=0,_2dc=[],node;node=_2d9[i];i++){h.concat(_2dc,Element.nextSiblings(node));}return _2dc;},nextElementSibling:function(node){while(node=node.nextSibling){if(node.nodeType==1){return node;}}return null;},previousElementSibling:function(node){while(node=node.previousSibling){if(node.nodeType==1){return node;}}return null;},tagName:function(_2e0,root,_2e2,_2e3){var _2e4=_2e2.toUpperCase();var _2e5=[],h=Selector.handlers;if(_2e0){if(_2e3){if(_2e3=="descendant"){for(var i=0,node;node=_2e0[i];i++){h.concat(_2e5,node.getElementsByTagName(_2e2));}return _2e5;}else{_2e0=this[_2e3](_2e0);}if(_2e2=="*"){return _2e0;}}for(var i=0,node;node=_2e0[i];i++){if(node.tagName.toUpperCase()===_2e4){_2e5.push(node);}}return _2e5;}else{return root.getElementsByTagName(_2e2);}},id:function(_2e9,root,id,_2ec){var _2ed=$(id),h=Selector.handlers;if(!_2ed){return [];}if(!_2e9&&root==document){return [_2ed];}if(_2e9){if(_2ec){if(_2ec=="child"){for(var i=0,node;node=_2e9[i];i++){if(_2ed.parentNode==node){return [_2ed];}}}else{if(_2ec=="descendant"){for(var i=0,node;node=_2e9[i];i++){if(Element.descendantOf(_2ed,node)){return [_2ed];}}}else{if(_2ec=="adjacent"){for(var i=0,node;node=_2e9[i];i++){if(Selector.handlers.previousElementSibling(_2ed)==node){return [_2ed];}}}else{_2e9=h[_2ec](_2e9);}}}}for(var i=0,node;node=_2e9[i];i++){if(node==_2ed){return [_2ed];}}return [];}return (_2ed&&Element.descendantOf(_2ed,root))?[_2ed]:[];},className:function(_2f1,root,_2f3,_2f4){if(_2f1&&_2f4){_2f1=this[_2f4](_2f1);}return Selector.handlers.byClassName(_2f1,root,_2f3);},byClassName:function(_2f5,root,_2f7){if(!_2f5){_2f5=Selector.handlers.descendant([root]);}var _2f8=" "+_2f7+" ";for(var i=0,_2fa=[],node,_2fc;node=_2f5[i];i++){_2fc=node.className;if(_2fc.length==0){continue;}if(_2fc==_2f7||(" "+_2fc+" ").include(_2f8)){_2fa.push(node);}}return _2fa;},attrPresence:function(_2fd,root,attr,_300){if(!_2fd){_2fd=root.getElementsByTagName("*");}if(_2fd&&_300){_2fd=this[_300](_2fd);}var _301=[];for(var i=0,node;node=_2fd[i];i++){if(Element.hasAttribute(node,attr)){_301.push(node);}}return _301;},attr:function(_304,root,attr,_307,_308,_309){if(!_304){_304=root.getElementsByTagName("*");}if(_304&&_309){_304=this[_309](_304);}var _30a=Selector.operators[_308],_30b=[];for(var i=0,node;node=_304[i];i++){var _30e=Element.readAttribute(node,attr);if(_30e===null){continue;}if(_30a(_30e,_307)){_30b.push(node);}}return _30b;},pseudo:function(_30f,name,_311,root,_313){if(_30f&&_313){_30f=this[_313](_30f);}if(!_30f){_30f=root.getElementsByTagName("*");}return Selector.pseudos[name](_30f,_311,root);}},pseudos:{"first-child":function(_314,_315,root){for(var i=0,_318=[],node;node=_314[i];i++){if(Selector.handlers.previousElementSibling(node)){continue;}_318.push(node);}return _318;},"last-child":function(_31a,_31b,root){for(var i=0,_31e=[],node;node=_31a[i];i++){if(Selector.handlers.nextElementSibling(node)){continue;}_31e.push(node);}return _31e;},"only-child":function(_320,_321,root){var h=Selector.handlers;for(var i=0,_325=[],node;node=_320[i];i++){if(!h.previousElementSibling(node)&&!h.nextElementSibling(node)){_325.push(node);}}return _325;},"nth-child":function(_327,_328,root){return Selector.pseudos.nth(_327,_328,root);},"nth-last-child":function(_32a,_32b,root){return Selector.pseudos.nth(_32a,_32b,root,true);},"nth-of-type":function(_32d,_32e,root){return Selector.pseudos.nth(_32d,_32e,root,false,true);},"nth-last-of-type":function(_330,_331,root){return Selector.pseudos.nth(_330,_331,root,true,true);},"first-of-type":function(_333,_334,root){return Selector.pseudos.nth(_333,"1",root,false,true);},"last-of-type":function(_336,_337,root){return Selector.pseudos.nth(_336,"1",root,true,true);},"only-of-type":function(_339,_33a,root){var p=Selector.pseudos;return p["last-of-type"](p["first-of-type"](_339,_33a,root),_33a,root);},getIndices:function(a,b,_33f){if(a==0){return b>0?[b]:[];}return $R(1,_33f).inject([],function(memo,i){if(0==(i-b)%a&&(i-b)/a>=0){memo.push(i);}return memo;});},nth:function(_342,_343,root,_345,_346){if(_342.length==0){return [];}if(_343=="even"){_343="2n+0";}if(_343=="odd"){_343="2n+1";}var h=Selector.handlers,_348=[],_349=[],m;h.mark(_342);for(var i=0,node;node=_342[i];i++){if(!node.parentNode._countedByPrototype){h.index(node.parentNode,_345,_346);_349.push(node.parentNode);}}if(_343.match(/^\d+$/)){_343=Number(_343);for(var i=0,node;node=_342[i];i++){if(node.nodeIndex==_343){_348.push(node);}}}else{if(m=_343.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(m[1]=="-"){m[1]=-1;}var a=m[1]?Number(m[1]):1;var b=m[2]?Number(m[2]):0;var _34f=Selector.pseudos.getIndices(a,b,_342.length);for(var i=0,node,l=_34f.length;node=_342[i];i++){for(var j=0;j<l;j++){if(node.nodeIndex==_34f[j]){_348.push(node);}}}}}h.unmark(_342);h.unmark(_349);return _348;},"empty":function(_352,_353,root){for(var i=0,_356=[],node;node=_352[i];i++){if(node.tagName=="!"||(node.firstChild&&!node.innerHTML.match(/^\s*$/))){continue;}_356.push(node);}return _356;},"not":function(_358,_359,root){var h=Selector.handlers,_35c,m;var _35e=new Selector(_359).findElements(root);h.mark(_35e);for(var i=0,_360=[],node;node=_358[i];i++){if(!node._countedByPrototype){_360.push(node);}}h.unmark(_35e);return _360;},"enabled":function(_362,_363,root){for(var i=0,_366=[],node;node=_362[i];i++){if(!node.disabled){_366.push(node);}}return _366;},"disabled":function(_368,_369,root){for(var i=0,_36c=[],node;node=_368[i];i++){if(node.disabled){_36c.push(node);}}return _36c;},"checked":function(_36e,_36f,root){for(var i=0,_372=[],node;node=_36e[i];i++){if(node.checked){_372.push(node);}}return _372;}},operators:{"=":function(nv,v){return nv==v;},"!=":function(nv,v){return nv!=v;},"^=":function(nv,v){return nv.startsWith(v);},"$=":function(nv,v){return nv.endsWith(v);},"*=":function(nv,v){return nv.include(v);},"~=":function(nv,v){return (" "+nv+" ").include(" "+v+" ");},"|=":function(nv,v){return ("-"+nv.toUpperCase()+"-").include("-"+v.toUpperCase()+"-");}},split:function(_382){var _383=[];_382.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(m){_383.push(m[1].strip());});return _383;},matchElements:function(_385,_386){var _387=$$(_386),h=Selector.handlers;h.mark(_387);for(var i=0,_38a=[],_38b;_38b=_385[i];i++){if(_38b._countedByPrototype){_38a.push(_38b);}}h.unmark(_387);return _38a;},findElement:function(_38c,_38d,_38e){if(Object.isNumber(_38d)){_38e=_38d;_38d=false;}return Selector.matchElements(_38c,_38d||"*")[_38e||0];},findChildElements:function(_38f,_390){_390=Selector.split(_390.join(","));var _391=[],h=Selector.handlers;for(var i=0,l=_390.length,_395;i<l;i++){_395=new Selector(_390[i].strip());h.concat(_391,_395.findElements(_38f));}return (l>1)?h.unique(_391):_391;}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(a,b){for(var i=0,node;node=b[i];i++){if(node.tagName!=="!"){a.push(node);}}return a;},unmark:function(_39a){for(var i=0,node;node=_39a[i];i++){node.removeAttribute("_countedByPrototype");}return _39a;}});}function $$(){return Selector.findChildElements(document,$A(arguments));}var Form={reset:function(form){$(form).reset();return form;},serializeElements:function(_39e,_39f){if(typeof _39f!="object"){_39f={hash:!!_39f};}else{if(Object.isUndefined(_39f.hash)){_39f.hash=true;}}var key,_3a1,_3a2=false,_3a3=_39f.submit;var data=_39e.inject({},function(_3a5,_3a6){if(!_3a6.disabled&&_3a6.name){key=_3a6.name;_3a1=$(_3a6).getValue();if(_3a1!=null&&(_3a6.type!="submit"||(!_3a2&&_3a3!==false&&(!_3a3||key==_3a3)&&(_3a2=true)))){if(key in _3a5){if(!Object.isArray(_3a5[key])){_3a5[key]=[_3a5[key]];}_3a5[key].push(_3a1);}else{_3a5[key]=_3a1;}}}return _3a5;});return _39f.hash?data:Object.toQueryString(data);}};Form.Methods={serialize:function(form,_3a8){return Form.serializeElements(Form.getElements(form),_3a8);},getElements:function(form){return $A($(form).getElementsByTagName("*")).inject([],function(_3aa,_3ab){if(Form.Element.Serializers[_3ab.tagName.toLowerCase()]){_3aa.push(Element.extend(_3ab));}return _3aa;});},getInputs:function(form,_3ad,name){form=$(form);var _3af=form.getElementsByTagName("input");if(!_3ad&&!name){return $A(_3af).map(Element.extend);}for(var i=0,_3b1=[],_3b2=_3af.length;i<_3b2;i++){var _3b3=_3af[i];if((_3ad&&_3b3.type!=_3ad)||(name&&_3b3.name!=name)){continue;}_3b1.push(Element.extend(_3b3));}return _3b1;},disable:function(form){form=$(form);Form.getElements(form).invoke("disable");return form;},enable:function(form){form=$(form);Form.getElements(form).invoke("enable");return form;},findFirstElement:function(form){var _3b7=$(form).getElements().findAll(function(_3b8){return "hidden"!=_3b8.type&&!_3b8.disabled;});var _3b9=_3b7.findAll(function(_3ba){return _3ba.hasAttribute("tabIndex")&&_3ba.tabIndex>=0;}).sortBy(function(_3bb){return _3bb.tabIndex;}).first();return _3b9?_3b9:_3b7.find(function(_3bc){return ["input","select","textarea"].include(_3bc.tagName.toLowerCase());});},focusFirstElement:function(form){form=$(form);form.findFirstElement().activate();return form;},request:function(form,_3bf){form=$(form),_3bf=Object.clone(_3bf||{});var _3c0=_3bf.parameters,_3c1=form.readAttribute("action")||"";if(_3c1.blank()){_3c1=window.location.href;}_3bf.parameters=form.serialize(true);if(_3c0){if(Object.isString(_3c0)){_3c0=_3c0.toQueryParams();}Object.extend(_3bf.parameters,_3c0);}if(form.hasAttribute("method")&&!_3bf.method){_3bf.method=form.method;}return new Ajax.Request(_3c1,_3bf);}};Form.Element={focus:function(_3c2){$(_3c2).focus();return _3c2;},select:function(_3c3){$(_3c3).select();return _3c3;}};Form.Element.Methods={serialize:function(_3c4){_3c4=$(_3c4);if(!_3c4.disabled&&_3c4.name){var _3c5=_3c4.getValue();if(_3c5!=undefined){var pair={};pair[_3c4.name]=_3c5;return Object.toQueryString(pair);}}return "";},getValue:function(_3c7){_3c7=$(_3c7);var _3c8=_3c7.tagName.toLowerCase();return Form.Element.Serializers[_3c8](_3c7);},setValue:function(_3c9,_3ca){_3c9=$(_3c9);var _3cb=_3c9.tagName.toLowerCase();Form.Element.Serializers[_3cb](_3c9,_3ca);return _3c9;},clear:function(_3cc){$(_3cc).value="";return _3cc;},present:function(_3cd){return $(_3cd).value!="";},activate:function(_3ce){_3ce=$(_3ce);try{_3ce.focus();if(_3ce.select&&(_3ce.tagName.toLowerCase()!="input"||!["button","reset","submit"].include(_3ce.type))){_3ce.select();}}catch(e){}return _3ce;},disable:function(_3cf){_3cf=$(_3cf);_3cf.blur();_3cf.disabled=true;return _3cf;},enable:function(_3d0){_3d0=$(_3d0);_3d0.disabled=false;return _3d0;}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(_3d1,_3d2){switch(_3d1.type.toLowerCase()){case "checkbox":case "radio":return Form.Element.Serializers.inputSelector(_3d1,_3d2);default:return Form.Element.Serializers.textarea(_3d1,_3d2);}},inputSelector:function(_3d3,_3d4){if(Object.isUndefined(_3d4)){return _3d3.checked?_3d3.value:null;}else{_3d3.checked=!!_3d4;}},textarea:function(_3d5,_3d6){if(Object.isUndefined(_3d6)){return _3d5.value;}else{_3d5.value=_3d6;}},select:function(_3d7,_3d8){if(Object.isUndefined(_3d8)){return this[_3d7.type=="select-one"?"selectOne":"selectMany"](_3d7);}else{var opt,_3da,_3db=!Object.isArray(_3d8);for(var i=0,_3dd=_3d7.length;i<_3dd;i++){opt=_3d7.options[i];_3da=this.optionValue(opt);if(_3db){if(_3da==_3d8){opt.selected=true;return;}}else{opt.selected=_3d8.include(_3da);}}}},selectOne:function(_3de){var _3df=_3de.selectedIndex;return _3df>=0?this.optionValue(_3de.options[_3df]):null;},selectMany:function(_3e0){var _3e1,_3e2=_3e0.length;if(!_3e2){return null;}for(var i=0,_3e1=[];i<_3e2;i++){var opt=_3e0.options[i];if(opt.selected){_3e1.push(this.optionValue(opt));}}return _3e1;},optionValue:function(opt){return Element.extend(opt).hasAttribute("value")?opt.value:opt.text;}};Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function(_3e6,_3e7,_3e8,_3e9){_3e6(_3e9,_3e8);this.element=$(_3e7);this.lastValue=this.getValue();},execute:function(){var _3ea=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(_3ea)?this.lastValue!=_3ea:String(this.lastValue)!=String(_3ea)){this.callback(this.element,_3ea);this.lastValue=_3ea;}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element);}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element);}});Abstract.EventObserver=Class.create({initialize:function(_3eb,_3ec){this.element=$(_3eb);this.callback=_3ec;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks();}else{this.registerCallback(this.element);}},onElementEvent:function(){var _3ed=this.getValue();if(this.lastValue!=_3ed){this.callback(this.element,_3ed);this.lastValue=_3ed;}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this);},registerCallback:function(_3ee){if(_3ee.type){switch(_3ee.type.toLowerCase()){case "checkbox":case "radio":Event.observe(_3ee,"click",this.onElementEvent.bind(this));break;default:Event.observe(_3ee,"change",this.onElementEvent.bind(this));break;}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element);}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element);}});if(!window.Event){var Event={};}Object.extend(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{},relatedTarget:function(_3ef){var _3f0;switch(_3ef.type){case "mouseover":_3f0=_3ef.fromElement;break;case "mouseout":_3f0=_3ef.toElement;break;default:return null;}return Element.extend(_3f0);}});Event.Methods=(function(){var _3f1;if(Prototype.Browser.IE){var _3f2={0:1,1:4,2:2};_3f1=function(_3f3,code){return _3f3.button==_3f2[code];};}else{if(Prototype.Browser.WebKit){_3f1=function(_3f5,code){switch(code){case 0:return _3f5.which==1&&!_3f5.metaKey;case 1:return _3f5.which==1&&_3f5.metaKey;default:return false;}};}else{_3f1=function(_3f7,code){return _3f7.which?(_3f7.which===code+1):(_3f7.button===code);};}}return {isLeftClick:function(_3f9){return _3f1(_3f9,0);},isMiddleClick:function(_3fa){return _3f1(_3fa,1);},isRightClick:function(_3fb){return _3f1(_3fb,2);},element:function(_3fc){var node=Event.extend(_3fc).target;return Element.extend(node.nodeType==Node.TEXT_NODE?node.parentNode:node);},findElement:function(_3fe,_3ff){var _400=Event.element(_3fe);if(!_3ff){return _400;}var _401=[_400].concat(_400.ancestors());return Selector.findElement(_401,_3ff,0);},pointer:function(_402){return {x:_402.pageX||(_402.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft)),y:_402.pageY||(_402.clientY+(document.documentElement.scrollTop||document.body.scrollTop))};},pointerX:function(_403){return Event.pointer(_403).x;},pointerY:function(_404){return Event.pointer(_404).y;},stop:function(_405){Event.extend(_405);_405.preventDefault();_405.stopPropagation();_405.stopped=true;}};})();Event.extend=(function(){var _406=Object.keys(Event.Methods).inject({},function(m,name){m[name]=Event.Methods[name].methodize();return m;});if(Prototype.Browser.IE){Object.extend(_406,{stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.returnValue=false;},inspect:function(){return "[object Event]";}});return function(_409){if(!_409){return false;}if(_409._extendedByPrototype){return _409;}_409._extendedByPrototype=Prototype.emptyFunction;var _40a=Event.pointer(_409);Object.extend(_409,{target:_409.srcElement,relatedTarget:Event.relatedTarget(_409),pageX:_40a.x,pageY:_40a.y});return Object.extend(_409,_406);};}else{Event.prototype=Event.prototype||document.createEvent("HTMLEvents").__proto__;Object.extend(Event.prototype,_406);return Prototype.K;}})();Object.extend(Event,(function(){var _40b=Event.cache;function getEventID(_40c){if(_40c._prototypeEventID){return _40c._prototypeEventID[0];}arguments.callee.id=arguments.callee.id||1;return _40c._prototypeEventID=[++arguments.callee.id];}function getDOMEventName(_40d){if(_40d&&_40d.include(":")){return "dataavailable";}return _40d;}function getCacheForID(id){return _40b[id]=_40b[id]||{};}function getWrappersForEventName(id,_410){var c=getCacheForID(id);return c[_410]=c[_410]||[];}function createWrapper(_412,_413,_414){var id=getEventID(_412);var c=getWrappersForEventName(id,_413);if(c.pluck("handler").include(_414)){return false;}var _417=function(_418){if(!Event||!Event.extend||(_418.eventName&&_418.eventName!=_413)){return false;}Event.extend(_418);_414.call(_412,_418);};_417.handler=_414;c.push(_417);return _417;}function findWrapper(id,_41a,_41b){var c=getWrappersForEventName(id,_41a);return c.find(function(_41d){return _41d.handler==_41b;});}function destroyWrapper(id,_41f,_420){var c=getCacheForID(id);if(!c[_41f]){return false;}c[_41f]=c[_41f].without(findWrapper(id,_41f,_420));}function destroyCache(){for(var id in _40b){for(var _423 in _40b[id]){_40b[id][_423]=null;}}}if(window.attachEvent){window.attachEvent("onunload",destroyCache);}return {observe:function(_424,_425,_426){_424=$(_424);var name=getDOMEventName(_425);var _428=createWrapper(_424,_425,_426);if(!_428){return _424;}if(_424.addEventListener){_424.addEventListener(name,_428,false);}else{_424.attachEvent("on"+name,_428);}return _424;},stopObserving:function(_429,_42a,_42b){_429=$(_429);var id=getEventID(_429),name=getDOMEventName(_42a);if(!_42b&&_42a){getWrappersForEventName(id,_42a).each(function(_42e){_429.stopObserving(_42a,_42e.handler);});return _429;}else{if(!_42a){Object.keys(getCacheForID(id)).each(function(_42f){_429.stopObserving(_42f);});return _429;}}var _430=findWrapper(id,_42a,_42b);if(!_430){return _429;}if(_429.removeEventListener){_429.removeEventListener(name,_430,false);}else{_429.detachEvent("on"+name,_430);}destroyWrapper(id,_42a,_42b);return _429;},fire:function(_431,_432,memo){_431=$(_431);if(_431==document&&document.createEvent&&!_431.dispatchEvent){_431=document.documentElement;}var _434;if(document.createEvent){_434=document.createEvent("HTMLEvents");_434.initEvent("dataavailable",true,true);}else{_434=document.createEventObject();_434.eventType="ondataavailable";}_434.eventName=_432;_434.memo=memo||{};if(document.createEvent){_431.dispatchEvent(_434);}else{_431.fireEvent(_434.eventType,_434);}return Event.extend(_434);}};})());Object.extend(Event,Event.Methods);Element.addMethods({fire:Event.fire,observe:Event.observe,stopObserving:Event.stopObserving});Object.extend(document,{fire:Element.Methods.fire.methodize(),observe:Element.Methods.observe.methodize(),stopObserving:Element.Methods.stopObserving.methodize(),loaded:false});(function(){var _435;function fireContentLoadedEvent(){if(document.loaded){return;}if(_435){window.clearInterval(_435);}document.fire("dom:loaded");document.loaded=true;}if(document.addEventListener){if(Prototype.Browser.WebKit){_435=window.setInterval(function(){if(/loaded|complete/.test(document.readyState)){fireContentLoadedEvent();}},0);Event.observe(window,"load",fireContentLoadedEvent);}else{document.addEventListener("DOMContentLoaded",fireContentLoadedEvent,false);}}else{document.write("<script id=__onDOMContentLoaded defer src=//:></script>");$("__onDOMContentLoaded").onreadystatechange=function(){if(this.readyState=="complete"){this.onreadystatechange=null;fireContentLoadedEvent();}};}})();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(_436,_437){return Element.insert(_436,{before:_437});},Top:function(_438,_439){return Element.insert(_438,{top:_439});},Bottom:function(_43a,_43b){return Element.insert(_43a,{bottom:_43b});},After:function(_43c,_43d){return Element.insert(_43c,{after:_43d});}};var $continue=new Error("\"throw $continue\" is deprecated, use \"return\" instead");var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;},within:function(_43e,x,y){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(_43e,x,y);}this.xcomp=x;this.ycomp=y;this.offset=Element.cumulativeOffset(_43e);return (y>=this.offset[1]&&y<this.offset[1]+_43e.offsetHeight&&x>=this.offset[0]&&x<this.offset[0]+_43e.offsetWidth);},withinIncludingScrolloffsets:function(_441,x,y){var _444=Element.cumulativeScrollOffset(_441);this.xcomp=x+_444[0]-this.deltaX;this.ycomp=y+_444[1]-this.deltaY;this.offset=Element.cumulativeOffset(_441);return (this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+_441.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+_441.offsetWidth);},overlap:function(mode,_446){if(!mode){return 0;}if(mode=="vertical"){return ((this.offset[1]+_446.offsetHeight)-this.ycomp)/_446.offsetHeight;}if(mode=="horizontal"){return ((this.offset[0]+_446.offsetWidth)-this.xcomp)/_446.offsetWidth;}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(_447){Position.prepare();return Element.absolutize(_447);},relativize:function(_448){Position.prepare();return Element.relativize(_448);},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(_449,_44a,_44b){_44b=_44b||{};return Element.clonePosition(_44a,_449,_44b);}};if(!document.getElementsByClassName){document.getElementsByClassName=function(_44c){function iter(name){return name.blank()?null:"[contains(concat(' ', @class, ' '), ' "+name+" ')]";}_44c.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(_44e,_44f){_44f=_44f.toString().strip();var cond=/\s/.test(_44f)?$w(_44f).map(iter).join(""):iter(_44f);return cond?document._getElementsByXPath(".//*"+cond,_44e):[];}:function(_451,_452){_452=_452.toString().strip();var _453=[],_454=(/\s/.test(_452)?$w(_452):null);if(!_454&&!_452){return _453;}var _455=$(_451).getElementsByTagName("*");_452=" "+_452+" ";for(var i=0,_457,cn;_457=_455[i];i++){if(_457.className&&(cn=" "+_457.className+" ")&&(cn.include(_452)||(_454&&_454.all(function(name){return !name.toString().blank()&&cn.include(" "+name+" ");})))){_453.push(Element.extend(_457));}}return _453;};return function(_45a,_45b){return $(_45b||document.body).getElementsByClassName(_45a);};}(Element.Methods);}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(_45c){this.element=$(_45c);},_each:function(_45d){this.element.className.split(/\s+/).select(function(name){return name.length>0;})._each(_45d);},set:function(_45f){this.element.className=_45f;},add:function(_460){if(this.include(_460)){return;}this.set($A(this).concat(_460).join(" "));},remove:function(_461){if(!this.include(_461)){return;}this.set($A(this).without(_461).join(" "));},toString:function(){return $A(this).join(" ");}};Object.extend(Element.ClassNames.prototype,Enumerable);Element.addMethods();String.prototype.parseColor=function(){var _462="#";if(this.slice(0,4)=="rgb("){var cols=this.slice(4,this.length-1).split(",");var i=0;do{_462+=parseInt(cols[i]).toColorPart();}while(++i<3);}else{if(this.slice(0,1)=="#"){if(this.length==4){for(var i=1;i<4;i++){_462+=(this.charAt(i)+this.charAt(i)).toLowerCase();}}if(this.length==7){_462=this.toLowerCase();}}}return (_462.length==7?_462:(arguments[0]||this));};Element.collectTextNodes=function(_465){return $A($(_465).childNodes).collect(function(node){return (node.nodeType==3?node.nodeValue:(node.hasChildNodes()?Element.collectTextNodes(node):""));}).flatten().join("");};Element.collectTextNodesIgnoreClass=function(_467,_468){return $A($(_467).childNodes).collect(function(node){return (node.nodeType==3?node.nodeValue:((node.hasChildNodes()&&!Element.hasClassName(node,_468))?Element.collectTextNodesIgnoreClass(node,_468):""));}).flatten().join("");};Element.setContentZoom=function(_46a,_46b){_46a=$(_46a);_46a.setStyle({fontSize:(_46b/100)+"em"});if(Prototype.Browser.WebKit){window.scrollBy(0,0);}return _46a;};Element.getInlineOpacity=function(_46c){return $(_46c).style.opacity||"";};Element.forceRerendering=function(_46d){try{_46d=$(_46d);var n=document.createTextNode(" ");_46d.appendChild(n);_46d.removeChild(n);}catch(e){}};var Effect={_elementDoesNotExistError:{name:"ElementDoesNotExistError",message:"The specified DOM element does not exist, but is required for this effect to operate"},Transitions:{linear:Prototype.K,sinoidal:function(pos){return (-Math.cos(pos*Math.PI)/2)+0.5;},reverse:function(pos){return 1-pos;},flicker:function(pos){var pos=((-Math.cos(pos*Math.PI)/4)+0.75)+Math.random()/4;return pos>1?1:pos;},wobble:function(pos){return (-Math.cos(pos*Math.PI*(9*pos))/2)+0.5;},pulse:function(pos,_474){_474=_474||5;return (((pos%(1/_474))*_474).round()==0?((pos*_474*2)-(pos*_474*2).floor()):1-((pos*_474*2)-(pos*_474*2).floor()));},spring:function(pos){return 1-(Math.cos(pos*4.5*Math.PI)*Math.exp(-pos*6));},none:function(pos){return 0;},full:function(pos){return 1;}},DefaultOptions:{duration:1,fps:100,sync:false,from:0,to:1,delay:0,queue:"parallel"},tagifyText:function(_478){var _479="position:relative";if(Prototype.Browser.IE){_479+=";zoom:1";}_478=$(_478);$A(_478.childNodes).each(function(_47a){if(_47a.nodeType==3){_47a.nodeValue.toArray().each(function(_47b){_478.insertBefore(new Element("span",{style:_479}).update(_47b==" "?String.fromCharCode(160):_47b),_47a);});Element.remove(_47a);}});},multiple:function(_47c,_47d){var _47e;if(((typeof _47c=="object")||Object.isFunction(_47c))&&(_47c.length)){_47e=_47c;}else{_47e=$(_47c).childNodes;}var _47f=Object.extend({speed:0.1,delay:0},arguments[2]||{});var _480=_47f.delay;$A(_47e).each(function(_481,_482){new _47d(_481,Object.extend(_47f,{delay:_482*_47f.speed+_480}));});},PAIRS:{"slide":["SlideDown","SlideUp"],"blind":["BlindDown","BlindUp"],"appear":["Appear","Fade"]},toggle:function(_483,_484){_483=$(_483);_484=(_484||"appear").toLowerCase();var _485=Object.extend({queue:{position:"end",scope:(_483.id||"global"),limit:1}},arguments[2]||{});Effect[_483.visible()?Effect.PAIRS[_484][1]:Effect.PAIRS[_484][0]](_483,_485);}};Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;Effect.ScopedQueue=Class.create(Enumerable,{initialize:function(){this.effects=[];this.interval=null;},_each:function(_486){this.effects._each(_486);},add:function(_487){var _488=new Date().getTime();var _489=Object.isString(_487.options.queue)?_487.options.queue:_487.options.queue.position;switch(_489){case "front":this.effects.findAll(function(e){return e.state=="idle";}).each(function(e){e.startOn+=_487.finishOn;e.finishOn+=_487.finishOn;});break;case "with-last":_488=this.effects.pluck("startOn").max()||_488;break;case "end":_488=this.effects.pluck("finishOn").max()||_488;break;}_487.startOn+=_488;_487.finishOn+=_488;if(!_487.options.queue.limit||(this.effects.length<_487.options.queue.limit)){this.effects.push(_487);}if(!this.interval){this.interval=setInterval(this.loop.bind(this),15);}},remove:function(_48c){this.effects=this.effects.reject(function(e){return e==_48c;});if(this.effects.length==0){clearInterval(this.interval);this.interval=null;}},loop:function(){var _48e=new Date().getTime();for(var i=0,len=this.effects.length;i<len;i++){this.effects[i]&&this.effects[i].loop(_48e);}}});Effect.Queues={instances:$H(),get:function(_491){if(!Object.isString(_491)){return _491;}return this.instances.get(_491)||this.instances.set(_491,new Effect.ScopedQueue());}};Effect.Queue=Effect.Queues.get("global");Effect.Base=Class.create({position:null,start:function(_492){function codeForEvent(_493,_494){return ((_493[_494+"Internal"]?"this.options."+_494+"Internal(this);":"")+(_493[_494]?"this.options."+_494+"(this);":""));}if(_492&&_492.transition===false){_492.transition=Effect.Transitions.linear;}this.options=Object.extend(Object.extend({},Effect.DefaultOptions),_492||{});this.currentFrame=0;this.state="idle";this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.fromToDelta=this.options.to-this.options.from;this.totalTime=this.finishOn-this.startOn;this.totalFrames=this.options.fps*this.options.duration;eval("this.render = function(pos){ "+"if (this.state==\"idle\"){this.state=\"running\";"+codeForEvent(this.options,"beforeSetup")+(this.setup?"this.setup();":"")+codeForEvent(this.options,"afterSetup")+"};if (this.state==\"running\"){"+"pos=this.options.transition(pos)*"+this.fromToDelta+"+"+this.options.from+";"+"this.position=pos;"+codeForEvent(this.options,"beforeUpdate")+(this.update?"this.update(pos);":"")+codeForEvent(this.options,"afterUpdate")+"}}");this.event("beforeStart");if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).add(this);}},loop:function(_495){if(_495>=this.startOn){if(_495>=this.finishOn){this.render(1);this.cancel();this.event("beforeFinish");if(this.finish){this.finish();}this.event("afterFinish");return;}var pos=(_495-this.startOn)/this.totalTime,_497=(pos*this.totalFrames).round();if(_497>this.currentFrame){this.render(pos);this.currentFrame=_497;}}},cancel:function(){if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).remove(this);}this.state="finished";},event:function(_498){if(this.options[_498+"Internal"]){this.options[_498+"Internal"](this);}if(this.options[_498]){this.options[_498](this);}},inspect:function(){var data=$H();for(property in this){if(!Object.isFunction(this[property])){data.set(property,this[property]);}}return "#<Effect:"+data.inspect()+",options:"+$H(this.options).inspect()+">";}});Effect.Parallel=Class.create(Effect.Base,{initialize:function(_49a){this.effects=_49a||[];this.start(arguments[1]);},update:function(_49b){this.effects.invoke("render",_49b);},finish:function(_49c){this.effects.each(function(_49d){_49d.render(1);_49d.cancel();_49d.event("beforeFinish");if(_49d.finish){_49d.finish(_49c);}_49d.event("afterFinish");});}});Effect.Tween=Class.create(Effect.Base,{initialize:function(_49e,from,to){_49e=Object.isString(_49e)?$(_49e):_49e;var args=$A(arguments),_4a2=args.last(),_4a3=args.length==5?args[3]:null;this.method=Object.isFunction(_4a2)?_4a2.bind(_49e):Object.isFunction(_49e[_4a2])?_49e[_4a2].bind(_49e):function(_4a4){_49e[_4a2]=_4a4;};this.start(Object.extend({from:from,to:to},_4a3||{}));},update:function(_4a5){this.method(_4a5);}});Effect.Event=Class.create(Effect.Base,{initialize:function(){this.start(Object.extend({duration:0},arguments[0]||{}));},update:Prototype.emptyFunction});Effect.Opacity=Class.create(Effect.Base,{initialize:function(_4a6){this.element=$(_4a6);if(!this.element){throw (Effect._elementDoesNotExistError);}if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1});}var _4a7=Object.extend({from:this.element.getOpacity()||0,to:1},arguments[1]||{});this.start(_4a7);},update:function(_4a8){this.element.setOpacity(_4a8);}});Effect.Move=Class.create(Effect.Base,{initialize:function(_4a9){this.element=$(_4a9);if(!this.element){throw (Effect._elementDoesNotExistError);}var _4aa=Object.extend({x:0,y:0,mode:"relative"},arguments[1]||{});this.start(_4aa);},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle("left")||"0");this.originalTop=parseFloat(this.element.getStyle("top")||"0");if(this.options.mode=="absolute"){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop;}},update:function(_4ab){this.element.setStyle({left:(this.options.x*_4ab+this.originalLeft).round()+"px",top:(this.options.y*_4ab+this.originalTop).round()+"px"});}});Effect.MoveBy=function(_4ac,_4ad,_4ae){return new Effect.Move(_4ac,Object.extend({x:_4ae,y:_4ad},arguments[3]||{}));};Effect.Scale=Class.create(Effect.Base,{initialize:function(_4af,_4b0){this.element=$(_4af);if(!this.element){throw (Effect._elementDoesNotExistError);}var _4b1=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:_4b0},arguments[2]||{});this.start(_4b1);},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle("position");this.originalStyle={};["top","left","width","height","fontSize"].each(function(k){this.originalStyle[k]=this.element.style[k];}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var _4b3=this.element.getStyle("font-size")||"100%";["em","px","%","pt"].each(function(_4b4){if(_4b3.indexOf(_4b4)>0){this.fontSize=parseFloat(_4b3);this.fontSizeType=_4b4;}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=="box"){this.dims=[this.element.offsetHeight,this.element.offsetWidth];}if(/^content/.test(this.options.scaleMode)){this.dims=[this.element.scrollHeight,this.element.scrollWidth];}if(!this.dims){this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth];}},update:function(_4b5){var _4b6=(this.options.scaleFrom/100)+(this.factor*_4b5);if(this.options.scaleContent&&this.fontSize){this.element.setStyle({fontSize:this.fontSize*_4b6+this.fontSizeType});}this.setDimensions(this.dims[0]*_4b6,this.dims[1]*_4b6);},finish:function(_4b7){if(this.restoreAfterFinish){this.element.setStyle(this.originalStyle);}},setDimensions:function(_4b8,_4b9){var d={};if(this.options.scaleX){d.width=_4b9.round()+"px";}if(this.options.scaleY){d.height=_4b8.round()+"px";}if(this.options.scaleFromCenter){var topd=(_4b8-this.dims[0])/2;var _4bc=(_4b9-this.dims[1])/2;if(this.elementPositioning=="absolute"){if(this.options.scaleY){d.top=this.originalTop-topd+"px";}if(this.options.scaleX){d.left=this.originalLeft-_4bc+"px";}}else{if(this.options.scaleY){d.top=-topd+"px";}if(this.options.scaleX){d.left=-_4bc+"px";}}}this.element.setStyle(d);}});Effect.Highlight=Class.create(Effect.Base,{initialize:function(_4bd){this.element=$(_4bd);if(!this.element){throw (Effect._elementDoesNotExistError);}var _4be=Object.extend({startcolor:"#ffff99"},arguments[1]||{});this.start(_4be);},setup:function(){if(this.element.getStyle("display")=="none"){this.cancel();return;}this.oldStyle={};if(!this.options.keepBackgroundImage){this.oldStyle.backgroundImage=this.element.getStyle("background-image");this.element.setStyle({backgroundImage:"none"});}if(!this.options.endcolor){this.options.endcolor=this.element.getStyle("background-color").parseColor("#ffffff");}if(!this.options.restorecolor){this.options.restorecolor=this.element.getStyle("background-color");}this._base=$R(0,2).map(function(i){return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16);}.bind(this));this._delta=$R(0,2).map(function(i){return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i];}.bind(this));},update:function(_4c1){this.element.setStyle({backgroundColor:$R(0,2).inject("#",function(m,v,i){return m+((this._base[i]+(this._delta[i]*_4c1)).round().toColorPart());}.bind(this))});},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}));}});Effect.ScrollTo=function(_4c5){var _4c6=arguments[1]||{},_4c7=document.viewport.getScrollOffsets(),_4c8=$(_4c5).cumulativeOffset(),max=(window.height||document.body.scrollHeight)-document.viewport.getHeight();if(_4c6.offset){_4c8[1]+=_4c6.offset;}return new Effect.Tween(null,_4c7.top,_4c8[1]>max?max:_4c8[1],_4c6,function(p){scrollTo(_4c7.left,p.round());});};Effect.Fade=function(_4cb){_4cb=$(_4cb);var _4cc=_4cb.getInlineOpacity();var _4cd=Object.extend({from:_4cb.getOpacity()||1,to:0,afterFinishInternal:function(_4ce){if(_4ce.options.to!=0){return;}_4ce.element.hide().setStyle({opacity:_4cc});}},arguments[1]||{});return new Effect.Opacity(_4cb,_4cd);};Effect.Appear=function(_4cf){_4cf=$(_4cf);var _4d0=Object.extend({from:(_4cf.getStyle("display")=="none"?0:_4cf.getOpacity()||0),to:1,afterFinishInternal:function(_4d1){_4d1.element.forceRerendering();},beforeSetup:function(_4d2){_4d2.element.setOpacity(_4d2.options.from).show();}},arguments[1]||{});return new Effect.Opacity(_4cf,_4d0);};Effect.Puff=function(_4d3){_4d3=$(_4d3);var _4d4={opacity:_4d3.getInlineOpacity(),position:_4d3.getStyle("position"),top:_4d3.style.top,left:_4d3.style.left,width:_4d3.style.width,height:_4d3.style.height};return new Effect.Parallel([new Effect.Scale(_4d3,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(_4d3,{sync:true,to:0})],Object.extend({duration:1,beforeSetupInternal:function(_4d5){Position.absolutize(_4d5.effects[0].element);},afterFinishInternal:function(_4d6){_4d6.effects[0].element.hide().setStyle(_4d4);}},arguments[1]||{}));};Effect.BlindUp=function(_4d7){_4d7=$(_4d7);_4d7.makeClipping();return new Effect.Scale(_4d7,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(_4d8){_4d8.element.hide().undoClipping();}},arguments[1]||{}));};Effect.BlindDown=function(_4d9){_4d9=$(_4d9);var _4da=_4d9.getDimensions();return new Effect.Scale(_4d9,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_4da.height,originalWidth:_4da.width},restoreAfterFinish:true,afterSetup:function(_4db){_4db.element.makeClipping().setStyle({height:"0px"}).show();},afterFinishInternal:function(_4dc){_4dc.element.undoClipping();}},arguments[1]||{}));};Effect.SwitchOff=function(_4dd){_4dd=$(_4dd);var _4de=_4dd.getInlineOpacity();return new Effect.Appear(_4dd,Object.extend({duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(_4df){new Effect.Scale(_4df.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(_4e0){_4e0.element.makePositioned().makeClipping();},afterFinishInternal:function(_4e1){_4e1.element.hide().undoClipping().undoPositioned().setStyle({opacity:_4de});}});}},arguments[1]||{}));};Effect.DropOut=function(_4e2){_4e2=$(_4e2);var _4e3={top:_4e2.getStyle("top"),left:_4e2.getStyle("left"),opacity:_4e2.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(_4e2,{x:0,y:100,sync:true}),new Effect.Opacity(_4e2,{sync:true,to:0})],Object.extend({duration:0.5,beforeSetup:function(_4e4){_4e4.effects[0].element.makePositioned();},afterFinishInternal:function(_4e5){_4e5.effects[0].element.hide().undoPositioned().setStyle(_4e3);}},arguments[1]||{}));};Effect.Shake=function(_4e6){_4e6=$(_4e6);var _4e7=Object.extend({distance:20,duration:0.5},arguments[1]||{});var _4e8=parseFloat(_4e7.distance);var _4e9=parseFloat(_4e7.duration)/10;var _4ea={top:_4e6.getStyle("top"),left:_4e6.getStyle("left")};return new Effect.Move(_4e6,{x:_4e8,y:0,duration:_4e9,afterFinishInternal:function(_4eb){new Effect.Move(_4eb.element,{x:-_4e8*2,y:0,duration:_4e9*2,afterFinishInternal:function(_4ec){new Effect.Move(_4ec.element,{x:_4e8*2,y:0,duration:_4e9*2,afterFinishInternal:function(_4ed){new Effect.Move(_4ed.element,{x:-_4e8*2,y:0,duration:_4e9*2,afterFinishInternal:function(_4ee){new Effect.Move(_4ee.element,{x:_4e8*2,y:0,duration:_4e9*2,afterFinishInternal:function(_4ef){new Effect.Move(_4ef.element,{x:-_4e8,y:0,duration:_4e9,afterFinishInternal:function(_4f0){_4f0.element.undoPositioned().setStyle(_4ea);}});}});}});}});}});}});};Effect.SlideDown=function(_4f1){_4f1=$(_4f1).cleanWhitespace();var _4f2=_4f1.down().getStyle("bottom");var _4f3=_4f1.getDimensions();return new Effect.Scale(_4f1,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:_4f3.height,originalWidth:_4f3.width},restoreAfterFinish:true,afterSetup:function(_4f4){_4f4.element.makePositioned();_4f4.element.down().makePositioned();if(window.opera){_4f4.element.setStyle({top:""});}_4f4.element.makeClipping().setStyle({height:"0px"}).show();},afterUpdateInternal:function(_4f5){_4f5.element.down().setStyle({bottom:(_4f5.dims[0]-_4f5.element.clientHeight)+"px"});},afterFinishInternal:function(_4f6){_4f6.element.undoClipping().undoPositioned();_4f6.element.down().undoPositioned().setStyle({bottom:_4f2});}},arguments[1]||{}));};Effect.SlideUp=function(_4f7){_4f7=$(_4f7).cleanWhitespace();var _4f8=_4f7.down().getStyle("bottom");var _4f9=_4f7.getDimensions();return new Effect.Scale(_4f7,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,scaleMode:{originalHeight:_4f9.height,originalWidth:_4f9.width},restoreAfterFinish:true,afterSetup:function(_4fa){_4fa.element.makePositioned();_4fa.element.down().makePositioned();if(window.opera){_4fa.element.setStyle({top:""});}_4fa.element.makeClipping().show();},afterUpdateInternal:function(_4fb){_4fb.element.down().setStyle({bottom:(_4fb.dims[0]-_4fb.element.clientHeight)+"px"});},afterFinishInternal:function(_4fc){_4fc.element.hide().undoClipping().undoPositioned();_4fc.element.down().undoPositioned().setStyle({bottom:_4f8});}},arguments[1]||{}));};Effect.Squish=function(_4fd){return new Effect.Scale(_4fd,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(_4fe){_4fe.element.makeClipping();},afterFinishInternal:function(_4ff){_4ff.element.hide().undoClipping();}});};Effect.Grow=function(_500){_500=$(_500);var _501=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var _502={top:_500.style.top,left:_500.style.left,height:_500.style.height,width:_500.style.width,opacity:_500.getInlineOpacity()};var dims=_500.getDimensions();var _504,_505;var _506,_507;switch(_501.direction){case "top-left":_504=_505=_506=_507=0;break;case "top-right":_504=dims.width;_505=_507=0;_506=-dims.width;break;case "bottom-left":_504=_506=0;_505=dims.height;_507=-dims.height;break;case "bottom-right":_504=dims.width;_505=dims.height;_506=-dims.width;_507=-dims.height;break;case "center":_504=dims.width/2;_505=dims.height/2;_506=-dims.width/2;_507=-dims.height/2;break;}return new Effect.Move(_500,{x:_504,y:_505,duration:0.01,beforeSetup:function(_508){_508.element.hide().makeClipping().makePositioned();},afterFinishInternal:function(_509){new Effect.Parallel([new Effect.Opacity(_509.element,{sync:true,to:1,from:0,transition:_501.opacityTransition}),new Effect.Move(_509.element,{x:_506,y:_507,sync:true,transition:_501.moveTransition}),new Effect.Scale(_509.element,100,{scaleMode:{originalHeight:dims.height,originalWidth:dims.width},sync:true,scaleFrom:window.opera?1:0,transition:_501.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(_50a){_50a.effects[0].element.setStyle({height:"0px"}).show();},afterFinishInternal:function(_50b){_50b.effects[0].element.undoClipping().undoPositioned().setStyle(_502);}},_501));}});};Effect.Shrink=function(_50c){_50c=$(_50c);var _50d=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var _50e={top:_50c.style.top,left:_50c.style.left,height:_50c.style.height,width:_50c.style.width,opacity:_50c.getInlineOpacity()};var dims=_50c.getDimensions();var _510,_511;switch(_50d.direction){case "top-left":_510=_511=0;break;case "top-right":_510=dims.width;_511=0;break;case "bottom-left":_510=0;_511=dims.height;break;case "bottom-right":_510=dims.width;_511=dims.height;break;case "center":_510=dims.width/2;_511=dims.height/2;break;}return new Effect.Parallel([new Effect.Opacity(_50c,{sync:true,to:0,from:1,transition:_50d.opacityTransition}),new Effect.Scale(_50c,window.opera?1:0,{sync:true,transition:_50d.scaleTransition,restoreAfterFinish:true}),new Effect.Move(_50c,{x:_510,y:_511,sync:true,transition:_50d.moveTransition})],Object.extend({beforeStartInternal:function(_512){_512.effects[0].element.makePositioned().makeClipping();},afterFinishInternal:function(_513){_513.effects[0].element.hide().undoClipping().undoPositioned().setStyle(_50e);}},_50d));};Effect.Pulsate=function(_514){_514=$(_514);var _515=arguments[1]||{};var _516=_514.getInlineOpacity();var _517=_515.transition||Effect.Transitions.sinoidal;var _518=function(pos){return _517(1-Effect.Transitions.pulse(pos,_515.pulses));};_518.bind(_517);return new Effect.Opacity(_514,Object.extend(Object.extend({duration:2,from:0,afterFinishInternal:function(_51a){_51a.element.setStyle({opacity:_516});}},_515),{transition:_518}));};Effect.Fold=function(_51b){_51b=$(_51b);var _51c={top:_51b.style.top,left:_51b.style.left,width:_51b.style.width,height:_51b.style.height};_51b.makeClipping();return new Effect.Scale(_51b,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(_51d){new Effect.Scale(_51b,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(_51e){_51e.element.hide().undoClipping().setStyle(_51c);}});}},arguments[1]||{}));};Effect.Morph=Class.create(Effect.Base,{initialize:function(_51f){this.element=$(_51f);if(!this.element){throw (Effect._elementDoesNotExistError);}var _520=Object.extend({style:{}},arguments[1]||{});if(!Object.isString(_520.style)){this.style=$H(_520.style);}else{if(_520.style.include(":")){this.style=_520.style.parseStyle();}else{this.element.addClassName(_520.style);this.style=$H(this.element.getStyles());this.element.removeClassName(_520.style);var css=this.element.getStyles();this.style=this.style.reject(function(_522){return _522.value==css[_522.key];});_520.afterFinishInternal=function(_523){_523.element.addClassName(_523.options.style);_523.transforms.each(function(_524){_523.element.style[_524.style]="";});};}}this.start(_520);},setup:function(){function parseColor(_525){if(!_525||["rgba(0, 0, 0, 0)","transparent"].include(_525)){_525="#ffffff";}_525=_525.parseColor();return $R(0,2).map(function(i){return parseInt(_525.slice(i*2+1,i*2+3),16);});}this.transforms=this.style.map(function(pair){var _528=pair[0],_529=pair[1],unit=null;if(_529.parseColor("#zzzzzz")!="#zzzzzz"){_529=_529.parseColor();unit="color";}else{if(_528=="opacity"){_529=parseFloat(_529);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1});}}else{if(Element.CSS_LENGTH.test(_529)){var _52b=_529.match(/^([\+\-]?[0-9\.]+)(.*)$/);_529=parseFloat(_52b[1]);unit=(_52b.length==3)?_52b[2]:null;}}}var _52c=this.element.getStyle(_528);return {style:_528.camelize(),originalValue:unit=="color"?parseColor(_52c):parseFloat(_52c||0),targetValue:unit=="color"?parseColor(_529):_529,unit:unit};}.bind(this)).reject(function(_52d){return ((_52d.originalValue==_52d.targetValue)||(_52d.unit!="color"&&(isNaN(_52d.originalValue)||isNaN(_52d.targetValue))));});},update:function(_52e){var _52f={},_530,i=this.transforms.length;while(i--){_52f[(_530=this.transforms[i]).style]=_530.unit=="color"?"#"+(Math.round(_530.originalValue[0]+(_530.targetValue[0]-_530.originalValue[0])*_52e)).toColorPart()+(Math.round(_530.originalValue[1]+(_530.targetValue[1]-_530.originalValue[1])*_52e)).toColorPart()+(Math.round(_530.originalValue[2]+(_530.targetValue[2]-_530.originalValue[2])*_52e)).toColorPart():(_530.originalValue+(_530.targetValue-_530.originalValue)*_52e).toFixed(3)+(_530.unit===null?"":_530.unit);}this.element.setStyle(_52f,true);}});Effect.Transform=Class.create({initialize:function(_532){this.tracks=[];this.options=arguments[1]||{};this.addTracks(_532);},addTracks:function(_533){_533.each(function(_534){_534=$H(_534);var data=_534.values().first();this.tracks.push($H({ids:_534.keys().first(),effect:Effect.Morph,options:{style:data}}));}.bind(this));return this;},play:function(){return new Effect.Parallel(this.tracks.map(function(_536){var ids=_536.get("ids"),_538=_536.get("effect"),_539=_536.get("options");var _53a=[$(ids)||$$(ids)].flatten();return _53a.map(function(e){return new _538(e,Object.extend({sync:true},_539));});}).flatten(),this.options);}});Element.CSS_PROPERTIES=$w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle "+"borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth "+"borderRightColor borderRightStyle borderRightWidth borderSpacing "+"borderTopColor borderTopStyle borderTopWidth bottom clip color "+"fontSize fontWeight height left letterSpacing lineHeight "+"marginBottom marginLeft marginRight marginTop markerOffset maxHeight "+"maxWidth minHeight minWidth opacity outlineColor outlineOffset "+"outlineWidth paddingBottom paddingLeft paddingRight paddingTop "+"right textIndent top width wordSpacing zIndex");Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement=document.createElement("div");String.prototype.parseStyle=function(){var _53c,_53d=$H();if(Prototype.Browser.WebKit){_53c=new Element("div",{style:this}).style;}else{String.__parseStyleElement.innerHTML="<div style=\""+this+"\"></div>";_53c=String.__parseStyleElement.childNodes[0].style;}Element.CSS_PROPERTIES.each(function(_53e){if(_53c[_53e]){_53d.set(_53e,_53c[_53e]);}});if(Prototype.Browser.IE&&this.include("opacity")){_53d.set("opacity",this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);}return _53d;};if(document.defaultView&&document.defaultView.getComputedStyle){Element.getStyles=function(_53f){var css=document.defaultView.getComputedStyle($(_53f),null);return Element.CSS_PROPERTIES.inject({},function(_541,_542){_541[_542]=css[_542];return _541;});};}else{Element.getStyles=function(_543){_543=$(_543);var css=_543.currentStyle,_545;_545=Element.CSS_PROPERTIES.inject({},function(_546,_547){_546[_547]=css[_547];return _546;});if(!_545.opacity){_545.opacity=_543.getOpacity();}return _545;};}Effect.Methods={morph:function(_548,_549){_548=$(_548);new Effect.Morph(_548,Object.extend({style:_549},arguments[2]||{}));return _548;},visualEffect:function(_54a,_54b,_54c){_54a=$(_54a);var s=_54b.dasherize().camelize(),_54e=s.charAt(0).toUpperCase()+s.substring(1);new Effect[_54e](_54a,_54c);return _54a;},highlight:function(_54f,_550){_54f=$(_54f);new Effect.Highlight(_54f,_550);return _54f;}};$w("fade appear grow shrink fold blindUp blindDown slideUp slideDown "+"pulsate shake puff squish switchOff dropOut").each(function(_551){Effect.Methods[_551]=function(_552,_553){_552=$(_552);Effect[_551.charAt(0).toUpperCase()+_551.substring(1)](_552,_553);return _552;};});$w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function(f){Effect.Methods[f]=Element[f];});Element.addMethods(Effect.Methods);var Builder={NODEMAP:{AREA:"map",CAPTION:"table",COL:"table",COLGROUP:"table",LEGEND:"fieldset",OPTGROUP:"select",OPTION:"select",PARAM:"object",TBODY:"table",TD:"table",TFOOT:"table",TH:"table",THEAD:"table",TR:"table"},node:function(_555){_555=_555.toUpperCase();var _556=this.NODEMAP[_555]||"div";var _557=document.createElement(_556);try{_557.innerHTML="<"+_555+"></"+_555+">";}catch(e){}var _558=_557.firstChild||null;if(_558&&(_558.tagName.toUpperCase()!=_555)){_558=_558.getElementsByTagName(_555)[0];}if(!_558){_558=document.createElement(_555);}if(!_558){return;}if(arguments[1]){if(this._isStringOrNumber(arguments[1])||(arguments[1] instanceof Array)||arguments[1].tagName){this._children(_558,arguments[1]);}else{var _559=this._attributes(arguments[1]);if(_559.length){try{_557.innerHTML="<"+_555+" "+_559+"></"+_555+">";}catch(e){}_558=_557.firstChild||null;if(!_558){_558=document.createElement(_555);for(attr in arguments[1]){_558[attr=="class"?"className":attr]=arguments[1][attr];}}if(_558.tagName.toUpperCase()!=_555){_558=_557.getElementsByTagName(_555)[0];}}}}if(arguments[2]){this._children(_558,arguments[2]);}return _558;},_text:function(text){return document.createTextNode(text);},ATTR_MAP:{"className":"class","htmlFor":"for"},_attributes:function(_55b){var _55c=[];for(attribute in _55b){_55c.push((attribute in this.ATTR_MAP?this.ATTR_MAP[attribute]:attribute)+"=\""+_55b[attribute].toString().escapeHTML().gsub(/"/,"&quot;")+"\"");}return _55c.join(" ");},_children:function(_55d,_55e){if(_55e.tagName){_55d.appendChild(_55e);return;}if(typeof _55e=="object"){_55e.flatten().each(function(e){if(typeof e=="object"){_55d.appendChild(e);}else{if(Builder._isStringOrNumber(e)){_55d.appendChild(Builder._text(e));}}});}else{if(Builder._isStringOrNumber(_55e)){_55d.appendChild(Builder._text(_55e));}}},_isStringOrNumber:function(_560){return (typeof _560=="string"||typeof _560=="number");},build:function(html){var _562=this.node("div");$(_562).update(html.strip());return _562.down();},dump:function(_563){if(typeof _563!="object"&&typeof _563!="function"){_563=window;}var tags=("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY "+"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET "+"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);tags.each(function(tag){_563[tag]=function(){return Builder.node.apply(Builder,[tag].concat($A(arguments)));};});}};LightboxOptions=Object.extend({fileLoadingImage:"lib/plugins/lightbox/images/loading.gif",fileBottomNavCloseImage:"lib/plugins/lightbox/images/closelabel.gif",overlayOpacity:0.8,animate:true,resizeSpeed:10,borderSize:10,labelImage:"Image",labelOf:"of"},window.LightboxOptions||{});var Lightbox=Class.create();Lightbox.prototype={imageArray:[],activeImage:undefined,initialize:function(){this.updateImageList();this.keyboardAction=this.keyboardAction.bindAsEventListener(this);if(LightboxOptions.resizeSpeed>10){LightboxOptions.resizeSpeed=10;}if(LightboxOptions.resizeSpeed<1){LightboxOptions.resizeSpeed=1;}this.resizeDuration=LightboxOptions.animate?((11-LightboxOptions.resizeSpeed)*0.15):0;this.overlayDuration=LightboxOptions.animate?0.2:0;var size=(LightboxOptions.animate?250:1)+"px";var _567=$$("body")[0];_567.appendChild(Builder.node("div",{id:"overlay"}));_567.appendChild(Builder.node("div",{id:"lightbox"},[Builder.node("div",{id:"outerImageContainer"},Builder.node("div",{id:"imageContainer"},[Builder.node("img",{id:"lightboxImage"}),Builder.node("div",{id:"hoverNav"},[Builder.node("a",{id:"prevLink",href:"#"}),Builder.node("a",{id:"nextLink",href:"#"})]),Builder.node("div",{id:"loading"},Builder.node("a",{id:"loadingLink",href:"#"},Builder.node("img",{src:LightboxOptions.fileLoadingImage})))])),Builder.node("div",{id:"imageDataContainer"},Builder.node("div",{id:"imageData"},[Builder.node("div",{id:"imageDetails"},[Builder.node("span",{id:"caption"}),Builder.node("span",{id:"numberDisplay"})]),Builder.node("div",{id:"bottomNav"},Builder.node("a",{id:"bottomNavClose",href:"#"},Builder.node("img",{src:LightboxOptions.fileBottomNavCloseImage})))]))]));$("overlay").hide().observe("click",(function(){this.end();}).bind(this));$("lightbox").hide().observe("click",(function(_568){if(_568.element().id=="lightbox"){this.end();}}).bind(this));$("outerImageContainer").setStyle({width:size,height:size});$("prevLink").observe("click",(function(_569){_569.stop();this.changeImage(this.activeImage-1);}).bindAsEventListener(this));$("nextLink").observe("click",(function(_56a){_56a.stop();this.changeImage(this.activeImage+1);}).bindAsEventListener(this));$("loadingLink").observe("click",(function(_56b){_56b.stop();this.end();}).bind(this));$("bottomNavClose").observe("click",(function(_56c){_56c.stop();this.end();}).bind(this));var th=this;(function(){var ids="overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink "+"imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose";$w(ids).each(function(id){th[id]=$(id);});}).defer();},updateImageList:function(){this.updateImageList=Prototype.emptyFunction;document.observe("click",(function(_570){var _571=_570.findElement("a[class^=media]:not([class~=mediafile])")||_570.findElement("area[class^=media]:not([class~=mediafile])");if(_571){_570.stop();this.start(_571);}}).bind(this));},start:function(_572){$$("select","object","embed").each(function(node){node.style.visibility="hidden";});var _574=this.getPageSize();$("overlay").setStyle({width:_574[0]+"px",height:_574[1]+"px"});new Effect.Appear(this.overlay,{duration:this.overlayDuration,from:0,to:LightboxOptions.overlayOpacity});this.imageArray=[];var _575=0;this.imageArray=$$(_572.tagName+"[href][class=\"media\"]").collect(function(_576){return [_576.href,_576.firstChild.getAttribute("title")];}).uniq();while(this.imageArray[_575][0]!=_572.href){_575++;}var _577=document.viewport.getScrollOffsets();var _578=_577[1]+(document.viewport.getHeight()/10);var _579=_577[0];this.lightbox.setStyle({top:_578+"px",left:_579+"px"}).show();this.changeImage(_575);},changeImage:function(_57a){this.activeImage=_57a;if(LightboxOptions.animate){this.loading.show();}this.lightboxImage.hide();this.hoverNav.hide();this.prevLink.hide();this.nextLink.hide();this.imageDataContainer.setStyle({opacity:0.0001});this.numberDisplay.hide();var _57b=new Image();_57b.onload=(function(){this.lightboxImage.src=this.imageArray[this.activeImage][0];this.resizeImageContainer(_57b.width,_57b.height);}).bind(this);_57b.src=this.imageArray[this.activeImage][0];},resizeImageContainer:function(_57c,_57d){var _57e=this.outerImageContainer.getWidth();var _57f=this.outerImageContainer.getHeight();var _580=(_57c+LightboxOptions.borderSize*2);var _581=(_57d+LightboxOptions.borderSize*2);var _582=(_580/_57e)*100;var _583=(_581/_57f)*100;var _584=_57e-_580;var _585=_57f-_581;if(_585!=0){new Effect.Scale(this.outerImageContainer,_583,{scaleX:false,duration:this.resizeDuration,queue:"front"});}if(_584!=0){new Effect.Scale(this.outerImageContainer,_582,{scaleY:false,duration:this.resizeDuration,delay:this.resizeDuration});}var _586=0;if((_585==0)&&(_584==0)){_586=100;if(Prototype.Browser.IE){_586=250;}}(function(){this.prevLink.setStyle({height:_57d+"px"});this.nextLink.setStyle({height:_57d+"px"});this.imageDataContainer.setStyle({width:_580+"px"});this.showImage();}).bind(this).delay(_586/1000);},showImage:function(){this.loading.hide();new Effect.Appear(this.lightboxImage,{duration:this.resizeDuration,queue:"end",afterFinish:(function(){this.updateDetails();}).bind(this)});this.preloadNeighborImages();},updateDetails:function(){if(this.imageArray[this.activeImage][1]!=""){this.caption.update(this.imageArray[this.activeImage][1]).show();}if(this.imageArray.length>1){this.numberDisplay.update(LightboxOptions.labelImage+" "+(this.activeImage+1)+" "+LightboxOptions.labelOf+"  "+this.imageArray.length).show();}new Effect.Parallel([new Effect.SlideDown(this.imageDataContainer,{sync:true,duration:this.resizeDuration,from:0,to:1}),new Effect.Appear(this.imageDataContainer,{sync:true,duration:this.resizeDuration})],{duration:this.resizeDuration,afterFinish:(function(){var _587=this.getPageSize();this.overlay.setStyle({height:_587[1]+"px"});this.updateNav();}).bind(this)});},updateNav:function(){this.hoverNav.show();if(this.activeImage>0){this.prevLink.show();}if(this.activeImage<(this.imageArray.length-1)){this.nextLink.show();}this.enableKeyboardNav();},enableKeyboardNav:function(){document.observe("keydown",this.keyboardAction);},disableKeyboardNav:function(){document.stopObserving("keydown",this.keyboardAction);},keyboardAction:function(_588){var _589=_588.keyCode;var _58a;if(_588.DOM_VK_ESCAPE){_58a=_588.DOM_VK_ESCAPE;}else{_58a=27;}var key=String.fromCharCode(_589).toLowerCase();if(key.match(/x|o|c/)||(_589==_58a)){this.end();}else{if((key=="p")||(_589==37)){if(this.activeImage!=0){this.disableKeyboardNav();this.changeImage(this.activeImage-1);}}else{if((key=="n")||(_589==39)){if(this.activeImage!=(this.imageArray.length-1)){this.disableKeyboardNav();this.changeImage(this.activeImage+1);}}}}},preloadNeighborImages:function(){var _58c,_58d;if(this.imageArray.length>this.activeImage+1){_58c=new Image();_58c.src=this.imageArray[this.activeImage+1][0];}if(this.activeImage>0){_58d=new Image();_58d.src=this.imageArray[this.activeImage-1][0];}},end:function(){this.disableKeyboardNav();this.lightbox.hide();new Effect.Fade(this.overlay,{duration:this.overlayDuration});$$("select","object","embed").each(function(node){node.style.visibility="visible";});},getPageSize:function(){var _58f,_590;if(window.innerHeight&&window.scrollMaxY){_58f=window.innerWidth+window.scrollMaxX;_590=window.innerHeight+window.scrollMaxY;}else{if(document.body.scrollHeight>document.body.offsetHeight){_58f=document.body.scrollWidth;_590=document.body.scrollHeight;}else{_58f=document.body.offsetWidth;_590=document.body.offsetHeight;}}var _591,_592;if(self.innerHeight){if(document.documentElement.clientWidth){_591=document.documentElement.clientWidth;}else{_591=self.innerWidth;}_592=self.innerHeight;}else{if(document.documentElement&&document.documentElement.clientHeight){_591=document.documentElement.clientWidth;_592=document.documentElement.clientHeight;}else{if(document.body){_591=document.body.clientWidth;_592=document.body.clientHeight;}}}if(_590<_592){pageHeight=_592;}else{pageHeight=_590;}if(_58f<_591){pageWidth=_58f;}else{pageWidth=_591;}return [pageWidth,pageHeight];}};document.observe("dom:loaded",function(){new Lightbox();});

/* XXXXXXXXXX end of lib/plugins/lightbox/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/info/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/info/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/config/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/config/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/displaywikipage/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/displaywikipage/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/vshare/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/vshare/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/popularity/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/popularity/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/pagemove/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/pagemove/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of lib/plugins/imagebox/script.js XXXXXXXXXX */



/* XXXXXXXXXX end of lib/plugins/imagebox/script.js XXXXXXXXXX */



/* XXXXXXXXXX begin of /home/letusdir/dokuwiki/conf/userscript.js XXXXXXXXXX */



/* XXXXXXXXXX end of /home/letusdir/dokuwiki/conf/userscript.js XXXXXXXXXX */

addInitEvent(function(){ ajax_qsearch.init('qsearch__in','qsearch__out'); });
addInitEvent(function(){ addEvent(document,'click',closePopups); });
addInitEvent(function(){ addTocToggle(); });
addInitEvent(function(){ initSizeCtl('size__ctl','wiki__text'); });
addInitEvent(function(){ initToolbar('tool__bar','wiki__text',toolbar); });
addInitEvent(function(){ initChangeCheck('Unsaved changes will be lost.\nReally continue?'); });
addInitEvent(function(){ locktimer.init(840,'Your lock for editing this page is about to expire in a minute.\nTo avoid conflicts use the preview button to reset the locktimer.',1); });
addInitEvent(function(){ scrollToMarker(); });
addInitEvent(function(){ focusMarker(); });

