// Merzia FX
// web2.0 javascript library
//   - utils
//   - ajax
//   - fading
//   - digg spy alike realtime events display
//   - balloon-style help boxes
//
// Copyright (C) 2007 Salvatore Sanfilippo (antirez at gmail dot com)
// Copyright (C) 2007 Merzia S.R.L.
// All Rights Reserved
//
// This library is released under the GPL version 2 license

/* =============================================================================
 * UTILS
 * ========================================================================== */

/* Just a less verbose way to getElementById() */
function k$(id) {
    if (typeof(id) == 'string')
        return document.getElementById(id);
    return id;
}

/* Return the innerHTML of the element with ID 'id' */
function $html(id) {
    id=k$(id);
    //return id.getElementById(id).innerHTML;
    return id.innerHTML;
}

/* Set the innerHTML of th element with ID 'id' */
function $sethtml(id,html) {
    id=k$(id);
    id.innerHTML = html;
}

/* Append HTML to innerHTML of element with ID 'id' */
function $apphtml(id,html) {
    id=k$(id);
    id.innerHTML += html;
}

/* Handy way to test if typeof(o) is 'undefined' */
function isdef(o) {
    return typeof(o) != 'undefined';
}

/* encodeURIComponent() working with IE5.0 */
function mfxEscape(s) {
    try {
        return encodeURIComponent(s);
    } catch(e) {
        var e = escape(s);
        e = e.replace(/@/g,"%40");
        e = e.replace(/\//g,"%2f");
        e = e.replace(/\+/g,"%2b");
        return e;
    }
}

/* decodeURIComponent() working with IE5.0 */
function mfxUnescape(s) {
    try {
        s = s.replace(/\+/g,"%20");
        return decodeURIComponent(s);
    } catch(e) {
        var s = unescape(s);
        s = s.replace(/\+/g," ");
        return s;
    }
}

/* mfxGetUrlParam("http://www.google.com?foo=bar","foo") => "bar" */
function mfxGetUrlParam(url,name) {
    var re="(&|\\?)"+name+"=([^&]*)";
    if (m = url.match(re)) return mfxUnescape(m[2]);
    return false;
}

/* Preform an action every N milliseconds */
function mfxEvery(milliseconds,handler) {
    if (handler() !== false)
        setTimeout(function() {
            mfxEvery(milliseconds,handler);
        },milliseconds);
}

function mfxGetElementsByClass(cname) {
    var el = document.getElementsByTagName('*');
    var res = [];
    for (var i = 0; i < el.length; i++) {
        var aux = ' '+el[i].className+' ';
        if (aux.indexOf(cname) != -1) {
            res[res.length] = el[i];
        }
    }
    return res;
}

function mfxSaveStyle(o,pname,defvalue) {
    o = k$(o);
    if (!isdef(o.mfxSavedStyle)) o.mfxSavedStyle = {};
    var value = o.style[pname];
    if (!isdef(value)) value=defvalue;
    o.mfxSavedStyle[pname]=value;
}

function mfxRestoreStyle(o,pname) {
    o = k$(o);
    if (!isdef(o.mfxSavedStyle) || !isdef(o.mfxSavedStyle[pname])) return;
    o.style[pname] = o.mfxSavedStyle[pname];
    delete o.mfxSavedStyle[pname];
}

function mfxMap(o,f) {
    var res = [];
    for(var i = 0; i < o.length; i++)
        res[res.length] = f(o[i]);
    return res;
}

/* =============================================================================
 * JSON
 * ========================================================================== */
function mfxJson(o) {
    if (typeof(o) == 'boolean') return String(o);
    if (typeof(o) == 'number') return String(o);
    if (typeof(o) == 'string') return mfxJsonString(o);
    if (typeof(o) == 'object') {
        if (o.constructor == Array) {
            return mfxJsonArray(o);
        } else {
            return mfxJsonObject(o);
        }
    }
    if (typeof(o) == 'undefined') return "undefined";
    return undefined;
}

/* The string to json conversion is taken from json.org */
function mfxJsonString(s) {
    if (typeof(s) != 'string') s = String(s);
    var m = {   '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f',
                '\r': '\\r', '"' : '\\"', '\\': '\\\\' };
    if (/["\\\x00-\x1f]/.test(s)) {
        return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
            var c = m[b];
            if (c) {
                return c;
            }
            c = b.charCodeAt();
            return '\\u00' +
                Math.floor(c / 16).toString(16) +
                (c % 16).toString(16);
        }) + '"';
    }
    return '"'+s+'"';
}

function mfxJsonArray(a) {
    var s = "[";
    for (var j = 0; j < a.length; j++) {
        s += mfxJson(a[j]);
        if (j != a.length-1) s += ",";
    }
    s += ']';
    return s;
}

function mfxJsonObject(o) {
    var s = "{";
    for (k in o) {
        s += k+":"+mfxJson(o[k])+",";
    }
    s += "}";
    s = s.replace(/,}$/,"}");
    return s;
}

/* =============================================================================
 * COOKIES
 * ========================================================================== */
function mfxSetCookie(name,value,expires,path,domain,secure)
{
    document.cookie= name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

function mfxGetCookie(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));
}

function mfxDelCookie(name,path,domain)
{
    if (mfxGetCookie(name)) {
        document.cookie = name + "=" + 
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +
            "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}

/* =============================================================================
 * FORMS
 * ========================================================================== */

function mfxGetInput(i) {
    i = k$(i);
    if (isdef(i.type)) {
        if (i.type == 'text' || i.type == 'password') {
            return i.value;
        } else if (i.type == 'select-one') {
            return String(i.selectedIndex);
        } else if (i.type == 'checkbox') {
            if (i.checked == true) return "1";
            return "0";
        }
    }
}

function mfxSetInput(i,v) {
    i = k$(i);
    if (isdef(i.type)) {
        if (i.type == 'text' || i.type == 'password') {
            i.value = v;
            if (typeof(i.onchange) == 'function') i.onchange();
        } else if (i.type == 'select-one') {
            i.selectedIndex = Number(v);
            if (typeof(i.onchange) == 'function') i.onchange();
        } else if (i.type == 'checkbox') {
            if ((Number(v) == true && i.checked == false) ||
                (Number(v) == false && i.checked == true))
            i.click();
        }
    }
}

function mfxSaveInputs(idlist) {
    var a = [];
    for (var i = 0; i < idlist.length; i++) {
        a[a.length] = idlist[i];
        a[a.length] = mfxGetInput(idlist[i]);
    }
    return a;
}

function mfxRestoreInputs(a) {
    for (var i = 0; i < a.length; i += 2)
        mfxSetInput(a[i],a[i+1]);
}

function mfxSaveInputsInString(idlist) {
    return mfxJson(mfxSaveInputs(idlist));
}

function mfxRestoreInputsFromString(s) {
    mfxRestoreInputs(eval(s));
}

function mfxSaveInputsInCookie(cookiename,idlist) {
    var s = mfxSaveInputsInString(idlist);
    mfxSetCookieDays(cookiename,s,1000);
}

function mfxSetCookieDays(name,val,days) {
    var now = new Date;
    var t = now.getTime();
    now.setTime(t+(3600*24*days*1000));
    mfxSetCookie(name,val,now,"/");
}

function mfxGetTime() {
    var now = new Date;
    return Math.floor(now.getTime()/1000);
}

function mfxRestoreInputsFromCookie(cookiename) {
    var c = mfxGetCookie(cookiename);
    if (c == null) return;
    mfxRestoreInputsFromString(c);
}

/* =============================================================================
 * BROWSER detection
 * ========================================================================== */

/* Browser detection is uncool, but sometimes to test
 * for features is impossible */
function mfxIsGecko() {
    if (mfxIsKonqueror()) return false;
    return navigator.userAgent.toLowerCase().indexOf("gecko") != -1;
}

function mfxIsExplorer() {
    if (isdef(window.opera)) return false;
    return navigator.userAgent.toLowerCase().indexOf("msie") != -1;
}

function mfxIsOpera() {
    return isdef(window.opera);
}

function mfxIsSafari() {
    return  isdef(navigator.vendor) &&
            navigator.vendor.toLowerCase().indexOf("apple") != -1;
}

function mfxIsKonqueror() {
    return  isdef(navigator.vendor) &&
            navigator.vendor.indexOf("KDE") != -1;
}

/* =============================================================================
 * AJAX
 * ========================================================================== */

/* Browser compatibilty.
 * Tested with:
 *
 * Firefox 1.0 to 1.5
 * Konqueror 3.4.2
 * Internet Explorer 5.0
 * internet Explorer 6.0
 * internet Explorer 7.0
 *
 * It should work also in Opera and Safari without troubles. */

// Create the XML HTTP request object. We try to be
// more cross-browser as possible.
function mfxCreateXmlHttpReq(handler) {
  var xmlhttp = null;
  try {
    xmlhttp = new XMLHttpRequest();
  } catch(e) {
    try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  xmlhttp.onreadystatechange = handler;
  return xmlhttp;
}

// An handler that does nothing, used for AJAX requests that
// don't require a reply and are non-critical about error conditions.
function mfxDummyHandler() {
    return true;
}

// Shortcut for creating a GET request and get the reply
// This few lines of code can make Ajax stuff much more trivial
// to write, and... to avoid patterns in programs is sane!
function mfxGet(url,handler) {
    var a = new Array("placeholder");
    for (var j=2; j<arguments.length; j++) {
        a[a.length] = arguments[j];
    }
    var ajax_req = mfxCreateXmlHttpReq(mfxDummyHandler);
    var myhandler = function() {
        var content = mfxAjaxOk(ajax_req);
        if (content !== false) {
            a[0] = content;
            try {
                return handler.apply(this, a);
            } catch(e) {
                return mfxApply(handler, a);
            }
        }
    }
    ajax_req.onreadystatechange = myhandler;
    ajax_req.open("GET",url);
    ajax_req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
    ajax_req.send(null);
}

// IE 5.0 does not support the apply() method of the function object,
// we resort to this eval-based solution that sucks because it is not
// capable of preserving 'this' and is ugly as hell, but it works for us.
function mfxApply(funcname,args) {
    var e = "funcname(";
    for (var i = 0; i < args.length; i++) {
        e += "args["+i+"]";
        if (i+1 != args.length) {
            e += ",";
        }
    }
    e += ");"
    return eval(e);
}

// Add a random parameter to the get request to avoid
// IE caching madness.
function mfxGetRand(url,handler) {
    url += (url.indexOf("?") == -1) ? "?" : "&";
    url += "rand="+escape(Math.random());
    arguments[0] = url;
    try {
        return mfxGet.apply(this,arguments);
    } catch(e) {
        return mfxApply(mfxGet,arguments);
    }
}

function mfxAjaxOk(req) {
    if (req.readyState == 4 && req.status == 200) {
        return req.responseText;
    } else {
        return false;
    }
}

/* =============================================================================
 * POSITIONING
 * ========================================================================== */

function mfxGetElementSize(ele) {
    ele=k$(ele);
    var o = {};
    if (isdef(ele.offsetHeight)) {
        /* IE ... */
        o.width = ele.offsetWidth;
        o.height = ele.offsetHeight;
    } else {
        /* W3C way, supported by Gecko */
        try {
            o.width = document.defaultView.getComputedStyle(ele,"").getPropertyValue("width");
            o.height = document.defaultView.getComputedStyle(ele,"").getPropertyValue("height");
        } catch(e) {
            o = false;
        }
    }
    return o;
}

/* INPUT -- e: the event object */
function mfxGetMousePos(e) {
    if (!e) e = window.event;
    var pos = {};
    if (isdef(e.pageX)) {
        pos.x = e.pageX;
        pos.y = e.pageY;
    } else {
        pos.x = e.clientX;
        pos.y = e.clientY;
    	pos.x += document.body.scrollLeft+document.documentElement.scrollLeft;
	pos.y += document.body.scrollTop+document.documentElement.scrollTop;
    }
    return pos;
}

function mfxMoveTo(e,x,y) {
    e=k$(e);
    if (e.style.position != 'absolute')
        e.style.position = 'absolute';
    e.style.left = x+'px';
    e.style.top = y+'px';
}

function mfxDelete(e) {
    e=k$(e);
    e.parentNode.removeChild(e);
}

function mfxFindPosition(e) {
    e = k$(e);
    var curleft = curtop = 0;
    if (e.offsetParent) {
        curleft = e.offsetLeft
        curtop = e.offsetTop
        while (e = e.offsetParent) {
            curleft += e.offsetLeft
            curtop += e.offsetTop
        }
    }
    return {x: curleft, y: curtop};
}

/* =============================================================================
 * DRAG & DROP
 * ========================================================================== */
function mfxDragEnable(e) {
    e = k$(e);
    e.mfxcandrag = true;
    e.onmousedown = mfxDragOrResizeStart;
}

function mfxDragDisable(e) {
    e = k$(e);
    e.mfxcandrag = undefined;
    if (!isdef(e.mfxcanresize)) {
        /* We can disable the onmousedown event handler
           only if it is not used by the resize code */
        e.onmousedown = null;
    }
}

/* The onmousedown event is shared between drag&drop and resize features */
function mfxDragOrResizeStart(e) {
    var o = this;
    if (isdef(o.mfxcanresize)) {
        if (mfxResizeStart(e,o)) return false;
    }
    if (isdef(o.mfxcandrag)) {
        mfxDragStart(e,o);
    }
    return false;
}

function mfxDragStart(e,o) {
    /* Check if the object already has top/left, otherwise
     * try to find it and set it */
    var opos = {};
    opos.x = parseInt(o.style.left);
    opos.y = parseInt(o.style.top);
    if (isNaN(opos.x) || isNaN(opos.y)) {
        var realpos = mfxFindPosition(o);
        o.style.position = 'absolute';
        o.style.left = realpos.x+'px';
        o.style.top = realpos.y+'px';
    }
    /* Initialization stuff, the real work is done in mfxDragMove() */
    var pos = mfxGetMousePos(e);
    o.dragLastX = pos.x;
    o.dragLastY = pos.y;
    document.onmousemove = function(e) {
        mfxDragMove(e,o);
    };
    document.onmouseup = function(e) {
        mfxDragStop(e,o);
    }
    if (typeof(o.ondragstart) == 'function')
        o.ondragstart(e,o);
    mfxSaveStyle(o,'zIndex','0');
    o.style.zIndex = '1000';
}

function mfxDragMove(e,o) {
    var mpos = mfxGetMousePos(e);
    var opos = {};
    opos.x = parseInt(o.style.left);
    opos.y = parseInt(o.style.top);
    var dx = mpos.x-o.dragLastX;
    var dy = mpos.y-o.dragLastY;
    o.dragLastX = mpos.x;
    o.dragLastY = mpos.y;
    o.style.top = (opos.y+dy)+'px';
    o.style.left = (opos.x+dx)+'px';
    if (typeof(o.ondrag) == 'function')
        o.ondrag(o);
    return false;
}

function mfxDragStop(e,o) {
    document.onmousemove = null;
    document.onmouseup = null;
    if (typeof(o.ondragstop) == 'function')
        o.ondragstop(e,o);
    mfxRestoreStyle(o,'zIndex');
}

/* =============================================================================
 * RESIZE
 * ========================================================================== */
function mfxResizeEnable(e) {
    e = k$(e);
    e.mfxcanresize = true;
    e.onmousedown = mfxDragOrResizeStart;
}

function mfxResizeDisable(e) {
    e = k$(e);
    e.mfxcanresize = undefined;
    if (!isdef(e.mfxcandrag)) {
        /* We can disable the onmousedown event handler
           only if it is not used by the drag&drop code */
        e.onmousedown = null;
    }
}

function mfxResizeStart(e,o) {
    var mpos = mfxGetMousePos(e);
    var opos = mfxFindPosition(o);
    var osize = mfxGetElementSize(o);
    var corner = {x: opos.x+osize.width, y: opos.y+osize.height};
    var delta = 8;
    /* Check if the object is clicked in the right-bottom angle,
       otherwise return false. */
    if (mpos.x >= corner.x-delta && mpos.x <= corner.x &&
        mpos.y >= corner.y-delta && mpos.y <= corner.y) {
        /* Ok, setup the resize operation */
        o.resizeLastX = mpos.x;
        o.resizeLastY = mpos.y;
        o.resizeWidth = osize.width;
        o.resizeHeight = osize.height;
        document.onmousemove = function(e) {
            mfxResizeMove(e,o);
        };
        document.onmouseup = function(e) {
            mfxResizeStop(e,o);
        }
        if (typeof(o.onresizestart) == 'function')
            o.onresizestart(e,o);
        mfxSaveStyle(o,'zIndex','0');
        o.style.zIndex = '1000';
        return true;
    } else {
        return false;
    }
}

function mfxResizeMove(e,o) {
    var mpos = mfxGetMousePos(e);
    var dx = mpos.x-o.resizeLastX;
    var dy = mpos.y-o.resizeLastY;
    o.resizeLastX = mpos.x;
    o.resizeLastY = mpos.y;
    o.resizeWidth += dx;
    o.resizeHeight += dy;
    o.style.width = (o.resizeWidth)+'px';
    o.style.height = (o.resizeHeight)+'px';
    if (typeof(o.onresize) == 'function')
        o.onresize(o);
    return false;
}

function mfxResizeStop(e,o) {
    document.onmousemove = null;
    document.onmouseup = null;
    if (typeof(o.onresizestop) == 'function')
        o.onresizestop(e,o);
    mfxRestoreStyle(o,'zIndex');
}

/* =============================================================================
 * CLICKTIPS - balloon-style helps on click or hover
 * ========================================================================== */
function registerClicktip(e,_text) {
    e.clicktipActive = false;
    e.onclick = function (event) {
        if (!event) var event = window.event;
        return handleClicktip(event,_text,e);
    };
}

function registerClicktipId(id,text) {
    var e = document.getElementById(id);
    if (e) {
        registerClicktip(e,text);
    } else {
        alert("Clicktip error: no such element ID '"+id+"'");
    }
}

/* Set a clicktip to all the elements of a given type/class */
function registerClicktipBulk(type,classname,text) {
    if (isdef(document.getElementsByTagName)) {
        var e = document.getElementsByTagName(type);
        var i;
        for (i = 0; i < e.length; i++) {
            if (!classname || e[i].className == classname) {
                registerClicktip(e[i], text);
            }
        }
    }
}

function registerOvertip(e,_text,showdelay,hidedelay) {
    e.clicktipActive = false;
    e.clicktipTimeout = false;
    e.onmouseover = function (event) {
        if (!event) var event = window.event;
        return handleOvertipOver(e,event,_text,showdelay,hidedelay);
    };
    e.onmouseout = function (event) {
        if (!event) var event = window.event;
        return handleOvertipOut(e,event,_text,showdelay,hidedelay);
    };
}

function registerOvertipId(id,text,showdelay,hidedelay) {
    var e = document.getElementById(id);
    if (e) {
        registerOvertip(e,text,showdelay,hidedelay);
    } else {
        alert("Clicktip error: no such element ID '"+id+"'");
    }
}

/* Set an overtip to all the elements of a given type/class */
function registerOvertipBulk(type,classname,text,showdelay,hidedelay) {
    if (isdef(document.getElementsByTagName)) {
        var e = document.getElementsByTagName(type);
        var i;
        for (i = 0; i < e.length; i++) {
            if (!classname || e[i].className == classname) {
                registerOvertip(e[i],text,showdelay,hidedelay);
            }
        }
    }
}

function delTip(div) {
    try {
        try { clearTimeout(div.clicktipTarget.clicktipTimeout); } catch(e) {};
        try { div.clicktipTarget.clicktipTimeout = false; } catch(e) {};
        try { div.clicktipTarget.clicktipActive = false; } catch(e) {};
        document.body.removeChild(div);
        delete(div);
    } catch(e) {};
}

function delTipOnClick() {
    delTip(this);
}

function createTipDiv(x,y,text,target) {
    /* Show a DIV with the right message */
    var div = document.createElement('div');
    div.className = 'clicktip';
    div.style.visibility = 'hidden';
    div.style.position = 'absolute';
    div.style.left = x+"px";
    div.style.top = y+"px";
    /* We set the DIV content usign innerHTML,
       If you are a purist append a text node instead ;) */
    div.innerHTML = text;

    /* When the clicktip gets clicked we hide it */
    div.clicktipTarget = target;
    div.onclick = delTipOnClick;
    document.body.appendChild(div);

    /* Try to fix the 'top' in order to display the div just over the pointer */
    var divsize = mfxGetElementSize(div);
    div.clicktipXDelta = 0;
    div.clicktipYDelta = 0;
    if (divsize) {
        /* Check if there is space on top to display the clicktip */
        if (divsize.height < y) {
            div.clicktipYDelta = -(divsize.height+2);
            div.clicktipXDelta = 2;
        } else {
            div.clicktipXDelta = 2;
            /* No space on top, display the tip on the bottom, i.e.
               just don't alter the current position. */
        }
    }
    if (div.clicktipXDelta || div.clicktipYDelta) {
        div.style.top = (y+div.clicktipYDelta)+"px";
        div.style.left = (x+div.clicktipXDelta)+"px";
    }
    div.style.visibility = 'visible';
    return div;
}

function handleClicktip(e,text,target) {
    /* A clicktip is already on screen for this object? Return */
    if (target.clicktipActive) return false;
    target.clicktipActive = true;

    /* The target object have a tipclick attribute? Use it as text */
    if (target.getAttribute('clicktip')) text=target.getAttribute('clicktip');
    if (!text) return; /* No text attribute nor one specified on registration */

    /* Get the mouse position */
    var mouse = mfxGetMousePos(e);

    /* Create/show the tip div */
    var div = createTipDiv(mouse.x,mouse.y,text,target);

    /* Compute how long the clicktip should be shown */
    var milliseconds = 2000; /* base time */
    var textlen = text.length;

    /* Add one second for every 50 characters */
    while(textlen > 30) {
        milliseconds += 1000;
        textlen -= 30;
    }

    /* Register a timer to remove the DIV after few seconds */
    setTimeout(function() {
        try {
            target.clicktipActive = false;
            document.body.removeChild(div);
            delete(div);
        } catch(e) {};
    }, milliseconds);
    return false;
}

function handleOvertipOver(target,e,text,showdelay,hidedelay)
{
    var mouse = mfxGetMousePos(e);

    target.clicktipX = mouse.x;
    target.clicktipY = mouse.y;

    /* An overtip is already scheduled or shown for this object? Return */
    if (target.clicktipTimeout !== false || target.clicktipActive) return false;

    /* Otherwise start the timer that will display the TIP */
    target.clicktipTimeout = setTimeout(function() {
        showAfterDelay(target,text,showdelay,hidedelay);
    }, showdelay);
}

function handleOvertipOut(target,e,text,showdelay,hidedelay)
{
    /* Clicktip scheduled but not yet shown, delete the timer */
    if (target.clicktipTimeout !== false && !target.clicktipActive) {
        try {
            clearTimeout(target.clicktipTimeout);
        } catch(e) {};
        target.clicktipTimeout = false;
        return;
    }

    /* Tip shown, register a timer to remove it */
    if (target.clicktipActive) {
        target.clicktipTimeout = setTimeout(function() {
            hideAfterDelay(target);
        }, hidedelay);
    }
}

function showAfterDelay(target,text,showdelay,hidedelay)
{
    var div = createTipDiv(target.clicktipX,target.clicktipY,text,target);
    target.clicktipActive = true;
    target.clicktipDiv = div;
    if (showdelay == 0) {
        target.onmousemove = function(event) {
            if (!event) var event = window.event;
            var mouse = mfxGetMousePos(event);
            tipFollowMouse(mouse,this);
        };
    }
}

function hideAfterDelay(target)
{
    delTip(target.clicktipDiv);
}

function tipFollowMouse(mouse,target) {
    var div = target.clicktipDiv;
    div.style.top = mouse.y + div.clicktipYDelta;
    div.style.left = mouse.x + div.clicktipXDelta;
}

/* =============================================================================
 * EFFECTS
 * ========================================================================== */

// Set object opacity in a cross-browser fashion
function mfxSetOpacity(o,val) {
    if (val == 1) val= mfxIsGecko() ? '' : 0.9999;
    o.style.opacity = val;
    try {
        o.style.filter = 'alpha(opacity='+Math.floor(val*100)+')';
    } catch(e) {};
}

// Fade the object 'o' from sval opacity to tval opacity
// i.e. mfxFade(o,0,1) will fade in
//      mfxFade(o,1,0) will fade out
function mfxFade(o,sval,tval,steps,delay) {
    o.style.zoom = '1'; // IE requires this to be set to 1 to set opacity
    if (isdef(o.fade)) {
        try {clearTimeout(o.fade.timeout);} catch(e) {}
        current = o.fade.current;
    } else {
        mfxSetOpacity(o,sval);
        current = sval;
    }
    o.fade = {};
    o.fade.steps = isdef(steps) ? steps : 20;
    o.fade.delay = isdef(delay) ? delay : 50;
    o.fade.sval = sval;
    o.fade.tval = tval;
    o.fade.incr = (tval-sval)/o.fade.steps;
    o.fade.current = current;
    mfxFadeTimeout(o);
}

function mfxFadeTimeout(o) {
    o.fade.current += o.fade.incr;
    if(o.fade.current < 0) o.fade.current = 0;
    else if(o.fade.current > 1) o.fade.current = 1;
    mfxSetOpacity(o,o.fade.current);
    if ((o.fade.incr > 0 && o.fade.current < o.fade.tval) ||
        (o.fade.incr < 0 && o.fade.current > o.fade.tval)) {
        o.fade.timeout = 
            setTimeout(function() {mfxFadeTimeout(o);}, o.fade.delay);
    } else {
        if (isdef(o.onfadedone)) o.onfadedone(o);
        o.fade = undefined;
    }
}

function mfxSpydivPush(div,classname,html) {
    var fade = isdef(div.spyNoFade) ? 0 : 1;
    var ele = document.createElement('div');
    var maxlen = isdef(div.spyMaxLen) ? div.spyMaxLen : 10;
    ele.className = classname;
    ele.innerHTML = html;
    if (fade) mfxSetOpacity(ele,0);
    if (!isdef(div.spyLastEle)) {
        div.appendChild(ele);
        div.spyLen = 1;
    } else {
        div.insertBefore(ele,div.spyLastEle);
        div.spyLen++;
    }
    div.spyLastEle = ele;
    if (fade) mfxFade(ele,0,1);
    while (div.spyLen > maxlen) {
        var nodes = div.childNodes;
        var last, i=0;
        while(1) {
            i++;
            last = nodes[nodes.length-i];
            if (!isdef(last.spyRemoved)) break;
        }
        if (fade) {
            last.onfadedone = function(e) {
                div.removeChild(e);
            }
            last.spyRemoved = true;
            mfxFade(last,1,0,5,50);
        } else {
            div.removeChild(last);
        }
        div.spyLen--;
    }
    return ele;
}

function mfxSpydivClear(div,toleave) {
    toleave = isdef(toleave) ? toleave : 0;
    while (div.spyLen > toleave) {
        var nodes = div.childNodes;
        var last, i=0;
        while(1) {
            i++;
            if (i > nodes.length) return;
            last = nodes[nodes.length-i];
            if (!isdef(last.spyRemoved)) break;
        }
        if (div.spyLastEle == last) div.spyLastEle = undefined;
        div.removeChild(last);
        div.spyLen--;
    }
}

function mfxToggle(o,type) {
    if(!isdef(type)) { type='block';}
    o = k$(o);
    if(!isdef(o.style.display) ||
       o.style.display=='' ||
       o.style.display==type) {
        mfxHide(o);
    } else {
        mfxShow(o,type);
    }
}

function mfxShow(o,type) {
    if(!isdef(type)) { type='block' }
    o = k$(o);
    o.style.display = type;
}

function mfxHide(o) {
    o = k$(o);
    o.style.display = 'none';
}

function kgetSelText()
{
    var txt = '';
     if (window.getSelection)
    {
        txt = window.getSelection();
             }
    else if (document.getSelection)
    {
        txt = document.getSelection();
            }
    else if (document.selection)
    {
        txt = document.selection.createRange().text;
            }
    else return;
return txt.toString();
}

function kquoteSelText(targetObj,toUsername) {
    var selText=kgetSelText()
    var selText=khtmkunentities(selText);

    targetObj.value=targetObj.value+"\n<quote>\n**"+toUsername+"** ha scritto:\n\n"+selText+"\n</quote>\n\n";
}

function khtmkunentities(text) {
    var text = text.replace(/&gt;/gi,">");
    return text;
}

/* Copyright(C) 2005-2007 Salvatore Sanfilippo <antirez@gmail.com>
 * All Rights Reserved. */
function validate(string, regexp, err, fieldName) {
    if (string.match(regexp) == null) {
        alert(err);
        warnField(fieldName);
        return false;
    }
    return true;
}
function validateEmpty(string,err,filedName) {
    return validate(string, "^.*[^ ]+.*$", err, filedName);
}
function isValidEmail(a){
    var at = a.indexOf("@");
    var name = a.substring(0, at);
    var isp = a.substring(at + 1, a.length);
    var dot = a.lastIndexOf(".");
    if (at == -1 || at == 0 || name == "" || isp == "" || dot == -1 ||
dot== (a.length - 1)){
        return false;
    }
    return true;
}
function warnField(fieldName){
    eval("document.f."+fieldName+".style.border='1px red solid'");
    eval("document.f."+fieldName+".focus();");
}
function clearFields(fields, hidelist) {
    for (i = 0; i < fields.length; i++) {
        eval("document.f."+fields[i]+".style.border='1px solid #aaa'");
    }
    if (hidelist != null) {
        for (i = 0; i < hidelist.length; i++) {
            mfxHide(hidelist[i]);
        }
    }
}
function areyousure(message) {
    return confirm(message + ": are you sure?");
}
//--------------------------------------------------------------------
function checkFormSettings(){
     pv = k$('ipass').value;
    npv = k$('inewpass').value;
    if (pv=="" && npv ==""){
        k$('iform').submit();
    } else {
        if (npv.length < 5){
            m=jst({"it":"La password non deve essere inferiore a 5 caratteri.",
                   "en":"The password must be at least of 5 characters."});
            alert(m);
        }else{
            k$('iform').submit();
        }
    }
}

function checkCartUserForm(){
    
    a=Array(
    'iname',
    'isurname',
    'ibilling_address',
    'ibilling_zipcode',
    'ibilling_city',
    'ibilling_province',
    'ibilling_state',
    'itelephone',
    //'ifax',
    'iemail',
    'iemailconfirm'
    );

    b=Array(
    'ishipping_address',
    'ishipping_zipcode',
    'ishipping_city',
    'ishipping_province',
    'ishipping_state',
    'ishipping_recipient'
    );
    
    errcnt=0;
    for (i in a){
        e=k$(a[i]);
        errcnt+=checkCartUserFormField(e);
    }

    shiptoshipaddress = k$('ishiptobillingaddress').checked;

    if(shiptoshipaddress){
        for (i in b){
            e=k$(b[i]);
            errcnt+=checkCartUserFormField(e);
        }   
    }

    if(!k$('inforeaded').checked){
        errcnt+=1;
        alert("E' necessario leggere l'informativa");
    }

    if(k$('istatus-no').checked){
        errcnt+=1;
        alert("E' necessario dare il proprio consenso al trattamento dei dati personali");
    }

    if (errcnt==0){
        document.f.submit();
    }else{
        alert('Alcuni campi non solo compilati correttamente. Controlla per favore');
    }
}

function checkCartUserFormField(e){

     pn=e.parentNode;
     
     remel=k$('errmsg'+e.name);     
     if (remel!=null){pn.removeChild(remel);}

     errcnt = 0;
     errmsg="";
     if (e.value==""){ 
        errcnt++;
        errmsg+=jst({"it":"Il campo non può essere vuoto ","en":"This field can't be empty "});
     }

     re="(^([a-z0-9_\.\-]+)@([a-z_0-9\-]+)\.([a-z]{2,})$)";
     isvalid = (e.value.match(re) != null) ? true : false;

     if (e.name=="email"){     
            errcnt += isvalid ? 0:1;

            if(e.value!=""){
                errmsg += isvalid ? "" : jst({"it":"Email non valida ","en":"Not valid email "});
            }
            if (e.value!=k$('iemailconfirm').value){
                errcnt++;
            //    errmsg= jst({"it":"Le due email devono essere uguali. ","en":"The two emails must be the same. "})
            }
     }

     if (e.name=="emailconfirm"){
            errcnt += isvalid ? 0:1;
            //errmsg += isvalid ? "" : jst({"it":"Email non valida. ","en":"Not valid email. "});
            if (e.value!=k$('iemail').value){
                errcnt++;
                errmsg=jst({"it":"Le due email devono essere uguali. ",
                    "en":"The two emails can be the same. "});
            }
     }

     if (errcnt>0){
         p=document.createElement("p");
         pn.appendChild(p);
         p.className="warn";
         p.id = "errmsg"+e.name;
         p.innerHTML=errmsg;
         //e.focus();
    }
    return errcnt;
}

function kkinsert_text(el,ins) {
    window.lstText={};
    if (el.setSelectionRange){
        el.value = el.value.substring(0,el.selectionStart) + ins + el.value.substring(el.selectionStart,el.selectionEnd) + el.value.substring(el.selectionEnd,el.value.length);
    }
    else if (document.selection && document.selection.createRange) {
        el.focus();
        var range = document.selection.createRange();
        range.text = ins + range.text;
    }
}


function kinstext(myField, myValue) {
    myField.focus();
    //IE support
    if (document.selection) {
        myField.focus();
        sel = document.selection.createRange();
        sel.text = myValue;
        myField.focus();
    } else if (myField.selectionStart || myField.selectionStart == '0') {
        //MOZILLA/NETSCAPE support
        var startPos = myField.selectionStart;
        var endPos = myField.selectionEnd;
        myField.value = myField.value.substring(0, startPos)
        + myValue
        + myField.value.substring(endPos, myField.value.length);
        myField.focus();
        myField.selectionStart = startPos + myValue.length;
        myField.selectionEnd = startPos + myValue.length;
    } else {
        myField.value += myValue;
        myField.focus();
    }
    myField.focus();
}
function ajaxCheckRegister(){
    url="/ajaxcheckregister.rhtml?";
    var vars=Array();
    var af=Array(
        "username",
        "password","repassword",
        "email","reemail"
    );
    for(i in af){
        var v=eval("document.f."+af[i]+".value;");
        vars[i]=af[i]+"="+v;
    }
    ajaxurl=url+vars.join("&");
    mfxGetRand(ajaxurl,checkRegister);
    return false;
}

function checkRegister(result){
    h=eval('('+result+')');
    var af=Array("username","password","email");
    for(i in af){
        id="regerr_"+af[i];
        e=k$(id);
        $sethtml(e,"");
        mfxHide(id);
    }
    if (h["result"]=="OK"){
        document.f.submit();
    }else{
        for (k in h){
            if (k!="result"){
                //var f=eval("document.f."+k);
                //f.value="";
                id="regerr_"+k;
                e=k$(id);
                $sethtml(e,h[k]);
                mfxShow(id);
            }
        }
    }
    return false;
}
function loginValidate(string, regexp, err, fieldName) {
    if (string.match(regexp) == null) {
        alert(err);
        warnLoginField(fieldName);
        return false;
    }
    return true;
}
function warnLoginField(fieldName)
{
    eval("document.flogin."+fieldName+".style.border='1px red solid'");
    eval("document.flogin."+fieldName+".focus();");
}
function checkLoginForm() {
    //disableButton('loginButton');//??????
    //var text="The username can't be shorter than three characters and can't contain special chars";
    var text1="La username non può essere più corta di tre caratteri e non puo contenere caratteri speciali.";
   
    if (!loginValidate(document.flogin.username.value, "^[A-z0-9\._-]{3,}$",text1,"username")){
            //enableButton('loginButton');//??????
        return false;
    }
    //var text="Password too short, use a password composed of five or more characters";
    var text="Password troppo corta, per favore inserisci una password di cinque o più caratteri.";
    if (!loginValidate(document.flogin.password.value, "^.{5,}$",text,"password")){
        //enableButton('loginButton');
        return false;
    }
    return true;
    //document.flogin.submit();
}
function checkAddForm() {
    if (!validate(document.f.title.value, "^.{1,}$", "The title can't be empty","title")) return false;
    return true;
}
var ajaxdone = true;
var jslang = "it";
function jst(h){
    return h[jslang];
}

function doAjax(url,handler) {
    if (ajaxdone){
        ajaxdone=false
        mfxGetRand(url,handler);
    }
}

function renderEditDay(result){
    k$('editcalendar').innerHTML=result;
    ajaxdone=true;
}

var notesaved="";

function saveDayNote(){
    var ut = k$('unixtime').value;
    var note = k$('note').value;
    if (notesaved!=note){
        var url="/doeditcalendar.rhtml?s="+ut+"&note="+mfxEscape(note.replace(/^\s+|\s+$/g,""));
        mfxGetRand(url,updateNoteMsg);
    }else{
       if(isnotesaved==true){
            k$('notemsg').innerHTML=jst({"it":"Salvate!","en":"Saved!"});
       }
    }
}
function updateNoteMsg(result){
    k$('notemsg').innerHTML = jst({"it":"Salvataggio in corso...","en":"Saving..."});
    notesaved = k$('note').value;
    isnotesaved = true;
    renderEditDay(result);
}
function doNothing(){}
window.size = function()
{
        var w = 0;
        var h = 0;

        //IE
        if(!window.innerWidth)
        {
                //strict mode
                if(!(document.documentElement.clientWidth == 0))
                {
                        w = document.documentElement.clientWidth;
                        h = document.documentElement.clientHeight;
                }
                //quirks mode
                else
                {
                        w = document.body.clientWidth;
                        h = document.body.clientHeight;
                }
        }
        //w3c
        else
        {
                w = window.innerWidth;
                h = window.innerHeight;
        }
        return {width:w,height:h};
}

window.center = function()
{
        var hWnd = (arguments[0] != null) ? arguments[0] : {width:0,height:0};

        var _x = 0;
        var _y = 0;
        var offsetX = 0;
        var offsetY = 0;

        //IE
        if(!window.pageYOffset)
        {
                //strict mode
                if(!(document.documentElement.scrollTop == 0))
                {
                        offsetY = document.documentElement.scrollTop;
                        offsetX = document.documentElement.scrollLeft;
                }
                //quirks mode
                else
                {
                        offsetY = document.body.scrollTop;
                        offsetX = document.body.scrollLeft;
                }
        }
        //w3c
        else
        {
                offsetX = window.pageXOffset;
                offsetY = window.pageYOffset;
        }

        _x = ((this.size().width-hWnd.width)/2)+offsetX;
        _y = ((this.size().height-hWnd.height)/2)+offsetY;

        return{x:_x,y:_y};
}
function popup (){

    if (arguments.length > 0) {
        var popmsg=arguments[0];
        poptitle="Confirm!";
        ok="<a class=\"popbtt\" onClick=\"popup();\">Ok</a>";
        no="";
    }
    if (arguments.length > 1) {
        var poptitle=arguments[1];
    }
    if (arguments.length > 2) {
        var ok="<a class=\"popbtt\" onClick=\""+arguments[2]+"\">Ok</a>";
    }   
    if (arguments.length > 3) {
        var no="<a class=\"popbtt\" onClick=\""+arguments[3]+"\">No</a>";
    }   

    if(!k$('shadow')){
        //background fading...
        var bgf=document.createElement('div');
        bgf.id='bgf';
        bgf.innerHTML="&nbsp;";

        var cont = 
            "<div id=\"popbox\">"+
                "<div class=\"poptitle\">"+poptitle+"</div>"+
                "<div class=\"popmsg\">"+popmsg+"</div>"+
                "<div class=\"popbtt\">"+
                    ok+no+
                    "<div class=\"cb\"></div>"+
                "</div>"+
            "</div>";
                
        var popup=document.createElement("div");
            popup.id="shadow";
            popup.innerHTML=cont;

        document.body.appendChild(bgf);
        document.body.appendChild(popup);
        //mfxFade(shadow,0,1,20,0);
        //mfxFade(k$('page'),1,0.5,10,0);

        var winH = $(window).height();
        var winW = $(window).width();
        var centerDiv = $('#shadow');
        centerDiv.css('top', (winH/2)-((centerDiv.height()+30)/2));
        centerDiv.css('left', (winW/2)-((centerDiv.width()+30)/2)); 
    }else{
        document.body.removeChild(k$('shadow')); 
        document.body.removeChild(k$('bgf')); 
        //mfxFade(k$('page'),0.5,1,10,0);
    } 
}

function popupc(){

    if (arguments.length > 0) {
        var popmsg=arguments[0];
        poptitle="";
        bttclosetext="Chiudi";//da usare con la funzione che traduce
        close="<a class=\"popbtt\" onClick=\"popupc();\">"+bttclosetext+"</a>";
    }
    if (arguments.length > 1) {
        var poptitle=arguments[1];
    }

    if(!k$('shadowc')){
        //background fading...
        var bgf=document.createElement('div');
        bgf.id='bgf';
        bgf.innerHTML="&nbsp;";
        var cont = 
            "<div id=\"popcbox\">"+
                "<div class=\"poptitle\">"+poptitle+"</div>"+
                "<div class=\"popmsg\">"+popmsg+"</div>"
            "</div>";                
        var popup=document.createElement("div");
            popup.id="shadowc";
            popup.innerHTML=cont;

        document.body.appendChild(bgf);
        document.body.appendChild(popup);

        var winH = $(window).height();
        var winW = $(window).width();
        var centerDiv = $('#shadowc');
        centerDiv.css('top', (winH/2)-((centerDiv.height()+30)/2));
        centerDiv.css('left', (winW/2)-((centerDiv.width()+30)/2)); 

        //mfxFade(shadow,0,1,20,0);
        //mfxFade(k$('page'),1,0.5,10,0);
        
    }else{
        document.body.removeChild(k$('shadowc'));
        document.body.removeChild(k$('bgf')); 
        //mfxFade(k$('page'),0.5,1,10,0);
    } 
}
function objisvisible(o,type){
    if(!isdef(type)) { type='block';}
    o = k$(o);
    if(!isdef(o.style.display) ||
       o.style.display=='' ||
       o.style.display==type) {
       return true; 
    }else{
       return false;
    }
}

function displaybasaltempgraphics(classname,lang){
    ids=mfxGetElementsByClass(classname);
    for(i=0;i<ids.length;i++){
        mfxToggle(ids[i]);
    }
    isv=objisvisible(ids[0]);
    if(isv){
        if (lang=='it'){
            $sethtml('displaybasaltempgraphics',"Nascondi temperatura basale");
        }else{
            $sethtml('displaybasaltempgraphics',"Hide basal body temperature");
        }
    }else{
        if (lang=='it'){
            $sethtml('displaybasaltempgraphics',"Mostra temperatura basale");
        }else{
            $sethtml('displaybasaltempgraphics',"Show basal body temperature");
        }
    }
}
function printMinicalendar(lang){    
    if (mfxIsExplorer()){
        if (lang=='it'){
            alert('Gentile utente, ti preghiamo di settare la stampa di questo documento in orizontale.');
        }else{
            alert('Dear user, please print this document in landscape mode.')
        }        
    }
    window.print();
}
function addToCartCalcTot(){
    var p=($html('iprice'));
    var q=(k$('iqt').value);
    var t=p*q;
    $sethtml('itot',t.toFixed(2));
    //$sethtml('iaddcartcheckmsg',"");
}
function AddToCartConfirmed(){
    var pid=(k$('ipid').value);
    var qt=(k$('iqt').value);
    var urlvars ="pid="+pid
        urlvars+="&qt="+qt
    ajaxurl="/ajaxaddtocart.rhtml?"+urlvars;
    mfxGetRand(ajaxurl,refreshCart);
}
function refreshCart(result){
    $sethtml('guide',result);
}
function setProductAddCartQt(pid){
    var urlvars ="pid="+pid
    ajaxurl="/ajaxproductqt.rhtml?"+urlvars;
    mfxGetRand(ajaxurl,setQt);
}
function setQt(result){
    qt = parseInt(result) > 0 ? parseInt(result)-1 : 0;
    k$('iqt').selectedIndex=qt;
    addToCartCalcTot();
}
function cartRemoveProduct(pid){
    var urlvars ="pid="+pid
    ajaxurl="/ajaxremovefromcart.rhtml?"+urlvars;
    mfxGetRand(ajaxurl,refreshCart);
}
function checkAddToCartConfirmed(){
    if (parseInt(k$('iqt').value) > 0 ){
        AddToCartConfirmed();popupc();
    }else{
       $sethtml('iaddcartcheckmsg',jst({"it":"La quantità non può essere 0!", "en":"The amount can not be 0"}))
    }
}
function toggleGhostFields(){
    $("#ighost").toggle();
}
function checkUsernameHandler(result){
    if (result=="true") {
        //document.f.submit();
        k$('husername').value=k$('username').value;
        document.f.submit();
    } else {
        //$sethtml('msg_sendbox_status',"<hr>Utente errato AJAX");
        k$('husername').value="";
        popup('Nome utente errato','Informazione');
    }
}

function checkUsername(){
    ajaxurl="/ajaxcheckusername.rhtml?username="+encodeURIComponent(k$('username').value);
    mfxGetRand(ajaxurl,checkUsernameHandler);
}

function checkTextUsername(e){
    var key;
    if(window.event)
        key = window.event.keyCode;     //IE
    else
        key = e.which;     //firefox   

    if(key == 13) {
        checkUsername();
    }
}
/*
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
 * Revision: 6246
 */
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
 * Sizzle CSS Selector Engine - v0.9.3
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();// Copyright 2009 Asa Wilson
// Available under both the GPL and MIT licenses, see license files for more details.

if (typeof jQuery == 'undefined') throw("jQuery could not be found.");

(function($){
  
  $.extend({
    DirtyForm: {
      debug         : false, // print out debug info? works best with firebug.
      changedClass  : 'changed',
      addClassOn    : new Function,
      hasFirebug    : "console" in window && "firebug" in window.console,
      logger        : function(msg){
                        if(this.debug){
                          msg = "DirtyForm: " + msg;
                          this.hasFirebug ? console.log(msg) : alert(msg);
                        }
                      },
      input_value   : function(input){
                        if(input.is(':radio,:checkbox')){
                          return typeof(input.attr("checked")) == "undefined" ? false : input.attr("checked");
                        } else {
                          return input.val();
                        }
                      }, 
      input_reset   : function(input){
                        if(input.is(':radio,:checkbox')){
                          input.attr('checked', input.data('initial'));
                        } else {
                          input.val(input.data('initial'));
                        }
                        input.trigger('blur.dirty_form')
                      },
      input_checker : function(event){
                        var npt = $(event.target), form = npt.parents('.dirtyform'), initial = npt.data("initial"), current = $.DirtyForm.input_value(npt), inputs = event.data.inputs, settings = event.data.settings
                        
                        if(initial != current) {
                          $.DirtyForm.logger("Form "+form.attr('class')+" is dirty. Changed from \""+initial+"\" to \""+current+"\"");
                          $.DirtyForm.logger("Class: "+settings.changedClass);
                          form
                            .data("dirty", true)                                      //TODO: check if we can use an expando property here
                            .trigger("dirty", {target: npt, from: initial, to: current, preventDefault: function(){return false}, stopPropagation: function(){return false}, bubbles: true, cancelable: true});
                          npt
                            .add(settings.addClassOn.apply(npt))
                            .addClass(settings.changedClass);                          // TODO: maybe we need to check if the class exists already?
                            
                        } else {
                          npt
                            .add(settings.addClassOn.apply(npt))
                            .removeClass(settings.changedClass)
                        }
                        
                        if(!inputs.filter('.' + settings.changedClass).size()){
                          form
                            .data("dirty",false)
                            .trigger("clean", {target: npt, preventDefault: function(){return false}, stopPropagation: function(){return false}, bubbles: true, cancelable: true});
                        }
                      }
    }
    
  });
    
  $.fn.clean_form = function(){
    return this.each(function(){
      var dirtyform = $(this)
      if(dirtyform.is('form')) {
        dirtyform.reset().find('.changed:input').each(function(){
          $(this).trigger('blur.dirty_form');
        });
      } else {
        $(':input:not(:hidden,:submit,:password,:button)', dirtyform).each(function(){
          $.DirtyForm.input_reset($(this));
        });
      }
    })
  }
  
  // will flag a form as dirty if something is changed on the form.
  $.fn.dirty_form = function(){
    var defaults = {
      changedClass  : $.DirtyForm.changedClass,
      addClassOn    : $.DirtyForm.addClassOn,
      dynamic       : $.isFunction($.livequery)
    }
    
    var settings = $.extend(defaults, arguments.length != 0 ? arguments[0] : {});

    return this.each(function(){
      var form = $(this);

      var inputs = $(':input:not(:hidden,:submit,:password,:button)', form)

      if( form.hasClass('dirtyform') ){
        // unbind all DirtyForms specific events, then proceed to re-add them
        form.unbind("dirty").unbind("clean");
        inputs.unbind("blur.dirty_form");
      }else{
        // mark it as a dirtyform
        $(this).addClass('dirtyform')
      }

      $.DirtyForm.logger('Storing initial data for form ' + form.get(0));
      
      if (settings.dynamic) {
        inputs.livequery(function(){ // use livequery to perform these functions on the new elements added to the form
          $(this)
            .bind("blur.dirty_form", {inputs: inputs, settings: settings}, $.DirtyForm.input_checker)
            .data('initial', $.DirtyForm.input_value($(this)))
        });
      }else {
        inputs.each(function(){
          $(this)
            .bind("blur.dirty_form", {inputs: inputs, settings: settings}, $.DirtyForm.input_checker)
            .data("initial", $.DirtyForm.input_value($(this)));
        });
      }
    });
  };
  
  
  // this is meant for selecting links that will warn about proceeding if there are any dirty forms on the page
  $.fn.dirty_stopper = function(){
    var defaults = {
      dialog : {
        title: "Warning: Unsaved Changes!",
        height: 300,
        width: 500,
        modal: true,
        resizeable: false,
        autoResize: false,
        overlay: {backgroundColor: "black", opacity: 0.5}
      },
      message : '<br/><p>You have changed form data without saving. All of your changes will be lost.</p><p>Are you sure you want to proceed?</p>'
    }
    
    var settings = $.extend(true, defaults, arguments.length != 0 ? arguments[0] : {});
    
    $.DirtyForm.logger("Setting dirty stoppers")    
    
    return this.each(function(){
      var stopper = $(this);
      
      if ($(this).parents('.ui-tabs-nav').length > 0){
        // FIXME: not sure what the comment below is actually saying. "Unchaining ... made it NOT work"?? (dvd, 03-02-2009)
        // Unchaining these tabs calls made the tab links not work
        var tabs = $(this).parents('.ui-tabs-nav');
        tabs.find('a').unbind('click.dirty_form');
        tabs.unbind('tabsselect.dirty_form');
        tabs.bind('tabsselect.dirty_form', function(event, ui){
          if($('.dirtyform').are_dirty()) {
            event.preventDefault();
            var div = $("<div id='dirty_stopper_dialog'/>").appendTo(document.body);
            var href = $(this).attr('href');
            div.dialog($.extend(settings.dialog, {
              buttons: {
                Proceed: function(){
                  var selected_id = $(ui.tab).parent().siblings('.ui-tabs-selected').find('a').attr('href');
                  // reset the form in the selected tab and make sure it cleans up after itself
                  $('.dirtyform', selected_id).clean_form();
                    
                  // select the tab now that the old tab is clean
                  tabs.tabs('select', $(ui.tab).attr('href'));
                  
                  // close the dialog with fire
                  $(this).dialog('destroy').remove()
                },
                Cancel: function(){$(this).dialog('destroy').remove()}
              }
            })).dialog("moveToTop").append(settings.message);
            // div.append(settings.message);
            return false
          }
        })
      } else {
        stopper.unbind('click.dirty_form')
        stopper.bind('click.dirty_form', function(event){
          if($('.dirtyform').are_dirty()) {
            event.preventDefault();
            var div = $("<div id='dirty_stopper_dialog'/>").appendTo(document.body);
            var href = $(this).attr('href');
            div.dialog($.extend({
                buttons: {
                  Proceed:function(){window.location = href},
                  Cancel:function(){$(this).dialog('destroy').remove(); return false}
                }
            }, settings.dialog)).dialog("moveToTop").append(settings.message);
          }
        });
      }
    });
  }
  
  // not chainable
  // returns false if any of the forms on the page are dirty
  $.fn.are_dirty = function (){
    var dirty = false
    this.each(function(){
      if($(this).data('dirty')) {
        dirty = true;
      }
    })
    return dirty
  }
  
  // This is just for testing purposes...
  $.fn.dirty_checker = function(){    
    $.DirtyForm.logger("Setting dirty checkers!")
    
    return this.each(function(){
      checker = $(this);
      checker.click(function(){
        if($("form").are_dirty()) {
          alert("Dirty Form!!");
        } else {
          alert("Clean Form ...phew!");
        }
      });
    });
  }
  
  // Shortcut to bind a handler to the "ondirty" event
  $.fn.extend({
    dirty: function(fn) {
  		return this.bind('dirty', fn);
  	},
  	clean: function(fn) {
  		return this.bind('clean', fn);
  	}
  });
})(jQuery);
function updategencommentvote(result){

            var result_split = result.split(',');

            var id = result_split[0];
            var vote = result_split[1];
            var total = result_split[2];
            var user = result_split[3];
            var color = result_split[4];
            var arrowid,arrowcolor,newvote;
            switch(vote){
                case '1': newvote=0;arrowid='aup';arrowcolor='green-up';break;
                case '-1': newvote=0;arrowid='aud';arrowcolor='red-down';break;
                case '0': arrowid='aup';arrowcolor='gray-up';break;
            }
           k$('aup'+id).src= '/images/arrowgray-up.gif'
           k$('aud'+id).src= '/images/arrowgray-down.gif'
           k$('aup'+id).onclick = function(){
                mfxGetRand('/ajaxvotegencomment.rhtml?user_id='+user+'&comment_id='+id+'&vote=1',updategencommentvote)
            }
           k$('aud'+id).onclick = function(){
                mfxGetRand('/ajaxvotegencomment.rhtml?user_id='+user+'&comment_id='+id+'&vote=-1',updategencommentvote)
           }
           
           //alert('/images/arrow'+arrowcolor);
           k$(arrowid+id).src = '/images/arrow'+arrowcolor+'.gif'
           k$(arrowid+id).onclick = function(){
                mfxGetRand('/ajaxvotegencomment.rhtml?user_id='+user+'&comment_id='+id+'&vote='+newvote,updategencommentvote)
            }
           if(vote=='0'){
                k$('aud'+id).src = '/images/arrowgray-down.gif';
                k$('aup'+id).onclick = function(){
                    mfxGetRand('/ajaxvotegencomment.rhtml?user_id='+user+'&comment_id='+id+'&vote=1',updategencommentvote)
                }
                k$('aud'+id).onclick = function(){
                    mfxGetRand('/ajaxvotegencomment.rhtml?user_id='+user+'&comment_id='+id+'&vote=-1',updategencommentvote)
                }
           }     
           //alert('pts'+id);
           k$('pts'+id).innerHTML='<b>'+total+' punti'+'</b>';
           //alert(color);
           k$('pts'+id).color=color;
}

function ajaxvoteproduct(result){
            if(document.getElementById('fieldproductrating').value=='-2'){
                 HTML='La tua valutazione &egrave; stata registrata';
            }

            else if (document.getElementById('fieldproductrating').value=='-1'){
                 HTML='Il prodotto &egrave; stato aggiunto nella tua <a href="/productlist/'+result+'?viewtype=wishlist">wishlist</a>';
            }
            else if (document.getElementById('fieldgamerating').value=='0'){
                 HTML='Il prodotto &egrave; stato rimosso dai tuoi prodotti';
                 
            }
            else{
                 HTML='Il prodotto &egrave; stato aggiunto a: <a href="/productlist/'+result+'">i tuoi prodotti</a>'; 
            }
            if(k$('fieldgamerating').options[0].value=='-' && document.getElementById('fieldproductrating').value!='0')
                    k$('fieldproductrating').options[0].value='0';
            k$('show').style.visibility='visible';
            k$('votemsg').innerHTML=HTML;
}            

function updateratingbar(result){
            //db('updateratingbar');
            //db('    result:');
            //db(result);
            //alert(result);
            var result_split = result.split(',');
            var id = result_split[0];
            var vote = result_split[1];
            var tot = result_split[2];
            var user = result_split[3];
            var colrange = result_split[4];
            var bar_id = result_split[5];
    
            colors= new Array();
            if(colrange!='' && colrange!=null){
                colors = colrange.split('>');
            }
            if (bar_id && bar_id!='')
                bar_id='_'+bar_id+'_';
           //alert(colors.toString());
            for(var i=parseInt(vote);i>=0;i--){
                cursor = k$('ratingcursor'+bar_id+i.toString());
                if(cursor){
                    cursor.className = 'ratingcursoron';
                    if(colors.length>0)
                        cursor.style.backgroundColor=colors[i-1].replace(/\|/g,',');
                }    
                else
                    break;
            }
            for(var i=(parseInt(vote)+1);i<=10;i++){
                cursor = k$('ratingcursor'+bar_id+i.toString());
                if(cursor){
                    cursor.className = 'ratingcursor';
                    if(colors.length>0)
                        cursor.style.backgroundColor='transparent';              
                }
                else
                    break;
            }
            clearTimeout(resettimer);
            if(bar_id=='')
                newvote=vote;
            else{
                var barid_num = parseInt(bar_id.replace(/_/g,''));
                if(newvote)
                    newvote[barid_num] = vote;
                else{
                    newvote = new Array();
                    newvote[barid_num] = vote;
                }
            }
            if (id!=0) { 
                location.reload();
            }
}

var gColorRange = new Array();
var resettimer = null;
var newvote = null;
function highlightbar(vote,bar_id,colorrange){
            if(bar_id!='')
                bar_id = '_'+bar_id+'_';
            if(gColorRange.length==0 && colorrange!=''){
                colrange = colorrange.split('-')
                gColorRange=colorize(10,colrange[0],colrange[1]);
               //alert(gColorRange.toString());
            }
            if(resettimer)
                clearTimeout(resettimer);
            //alert(colors.toString());
            for(var i=parseInt(vote);i>0;i--){
                cursor = k$('ratingcursor'+bar_id+i.toString());
                if(cursor){
                    cursor.style.backgroundColor=null;
                    cursor.removeAttribute('style');
                    cursor.className = 'ratingcursoron-over';
                    if(gColorRange.length>0)
                       cursor.style.backgroundColor=gColorRange[i-1];
                }    
                else
                    break;
            }
            for(var i=(parseInt(vote)+1);i<=10;i++){
                cursor = k$('ratingcursor'+bar_id+i.toString());
                if(cursor){
                    cursor.style.backgroundColor=null;
                    cursor.removeAttribute('style');
                    cursor.className = 'ratingcursor-over';
                    //if(colors.length>0)
                }
                else
                    break;
            }
}

function resetbar(oldvote,bar_id){
    if(newvote){
        if(bar_id=='')
            oldvote=newvote;
        else
            if(newvote[parseInt(bar_id)])
                oldvote=newvote[parseInt(bar_id)];
    }  
    if(resettimer)
        clearTimeout(resettimer);
    
    resettimer=setTimeout("updateratingbar('0,"+oldvote+",-1,-1,"+gColorRange.join('>').replace(/\n/g,'')+","+bar_id+"')",50);
}

function db(s,clear){
    if (clear){
        $sethtml('bardebug',s);
    }else{
        $apphtml('bardebug',s+"<br>");
    }
}
function int2hex(v){
  v=Math.round(Math.min(Math.max(0,v),255));
  return("0123456789ABCDEF".charAt((v-v%16)/16)+
    "0123456789ABCDEF".charAt(v%16));
}

function hex2rgb(/*:String */hexcolor){
  hexcolor = hexcolor.replace("#","");
  return(
         {0:parseInt(hexcolor.substr(0,2),16),
          1:parseInt(hexcolor.substr(2,2),16),
          2:parseInt(hexcolor.substr(4,2),16)}
         );
}

function zip(){
        var aZip=Array();
        var nArgs=arguments.length;
        var a=arguments[0];
        for (i=0;i<a.length;i++){
                var z=Array();
                for (j=0;j<nArgs;j++){
                        z.push(arguments[j][i]);
                }
                aZip.push(z);
        }
        return aZip;
}


function colorize(ncolors,startHexColor,endHexColor){
        startHexColor=startHexColor.replace("#","");
        endHexColor=endHexColor.replace("#","");

        v=20;//puoi giocare con questo valore

        //val = Math.log((v > max) ? max : v);

        ncolors = ncolors + 1
        var sR=hex2rgb(startHexColor)[0];
        var sG=hex2rgb(startHexColor)[1];
        var sB=hex2rgb(startHexColor)[2];

        var eR=hex2rgb(endHexColor)[0];
        var eG=hex2rgb(endHexColor)[1];
        var eB=hex2rgb(endHexColor)[2];

        aColorize=Array();
        var max,val;
        for (v=0;v<ncolors;v++){

                val = Math.log(((v > ncolors)? ncolors : v));
                max = Math.log(ncolors);
                //if(val < 1)
                  //  val = 1;
                var z=zip(Array(sR,sG,sB),Array(eR,eG,eB));

                dRGB=Array();
                for (i=0;i<z.length;i++){
                        dRGB.push((z[i][1]-z[i][0])/max);//1
                }
                dR=dRGB[0];dG=dRGB[1];dB=dRGB[2];

                xR = int2hex(parseInt(sR+dR*val));
                xG = int2hex(parseInt(sG+dG*val));
                xB = int2hex(parseInt(sB+dB*val));
               
               aColorize.push("#"+xR+xG+xB);                
        
        }
        aColorize.shift();
        return aColorize;
}

