
/*
    json2.js
    2007-12-02

    Public Domain

    No warranty expressed or implied. Use at your own risk.

    See http://www.JSON.org/js.html

    This file creates a global JSON object containing two methods:

        JSON.stringify(value, whitelist)
            value       any JavaScript value, usually an object or array.

            whitelist   an optional array prameter that determines how object
                        values are stringified.

            This method produces a JSON text from a JavaScript value.
            There are three possible ways to stringify an object, depending
            on the optional whitelist parameter.

            If an object has a toJSON method, then the toJSON() method will be
            called. The value returned from the toJSON method will be
            stringified.

            Otherwise, if the optional whitelist parameter is an array, then
            the elements of the array will be used to select members of the
            object for stringification.

            Otherwise, if there is no whitelist parameter, then all of the
            members of the object will be stringified.

            Values that do not have JSON representaions, such as undefined or
            functions, will not be serialized. Such values in objects will be
            dropped; in arrays will be replaced with null.
            JSON.stringify(undefined) returns undefined. Dates will be
            stringified as quoted ISO dates.

            Example:

            var text = JSON.stringify(['e', {pluribus: 'unum'}]);
            // text is '["e",{"pluribus":"unum"}]'

        JSON.parse(text, filter)
            This method parses a JSON text to produce an object or
            array. It can throw a SyntaxError exception.

            The optional filter parameter is a function that can filter and
            transform the results. It receives each of the keys and values, and
            its return value is used instead of the original value. If it
            returns what it received, then structure is not modified. If it
            returns undefined then the member is deleted.

            Example:

            // Parse the text. If a key contains the string 'date' then
            // convert the value to a date.

            myData = JSON.parse(text, function (key, value) {
                return key.indexOf('date') >= 0 ? new Date(value) : value;
            });

    This is a reference implementation. You are free to copy, modify, or
    redistribute.

    Use your own copy. It is extremely unwise to load third party
    code into your pages.
*/

/*jslint evil: true */

/*global JSON */

/*members "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
    charCodeAt, floor, getUTCDate, getUTCFullYear, getUTCHours,
    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, length,
    parse, propertyIsEnumerable, prototype, push, replace, stringify, test,
    toJSON, toString
*/

if (!this.JSON) {

    JSON = function () {

        function f(n) {    // Format integers to have at least two digits.
            return n < 10 ? '0' + n : n;
        }

        Date.prototype.toJSON = function () {

// Eventually, this method will be based on the date.toISOString method.

            return this.getUTCFullYear()   + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate())      + 'T' +
                 f(this.getUTCHours())     + ':' +
                 f(this.getUTCMinutes())   + ':' +
                 f(this.getUTCSeconds())   + 'Z';
        };


        var m = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        };

        function stringify(value, whitelist) {
            var a,          // The array holding the partial texts.
                i,          // The loop counter.
                k,          // The member key.
                l,          // Length.
                r = /["\\\x00-\x1f\x7f-\x9f]/g,
                v;          // The member value.

            switch (typeof value) {
            case 'string':

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe sequences.

                return r.test(value) ?
                    '"' + value.replace(r, function (a) {
                        var c = m[a];
                        if (c) {
                            return c;
                        }
                        c = a.charCodeAt();
                        return '\\u00' + Math.floor(c / 16).toString(16) +
                                                   (c % 16).toString(16);
                    }) + '"' :
                    '"' + value + '"';

            case 'number':

// JSON numbers must be finite. Encode non-finite numbers as null.

                return isFinite(value) ? String(value) : 'null';

            case 'boolean':
            case 'null':
                return String(value);

            case 'object':

// Due to a specification blunder in ECMAScript,
// typeof null is 'object', so watch out for that case.

                if (!value) {
                    return 'null';
                }

// If the object has a toJSON method, call it, and stringify the result.

                if (typeof value.toJSON === 'function') {
                    return stringify(value.toJSON());
                }
                a = [];
                if (typeof value.length === 'number' &&
                        !(value.propertyIsEnumerable('length'))) {

// The object is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

                    l = value.length;
                    for (i = 0; i < l; i += 1) {
                        a.push(stringify(value[i], whitelist) || 'null');
                    }

// Join all of the elements together and wrap them in brackets.

                    return '[' + a.join(',') + ']';
                }
                if (whitelist) {

// If a whitelist (array of keys) is provided, use it to select the components
// of the object.

                    l = whitelist.length;
                    for (i = 0; i < l; i += 1) {
                        k = whitelist[i];
                        if (typeof k === 'string') {
                            v = stringify(value[k], whitelist);
                            if (v) {
                                a.push(stringify(k) + ':' + v);
                            }
                        }
                    }
                } else {

// Otherwise, iterate through all of the keys in the object.

                    for (k in value) {
                        if (typeof k === 'string') {
                            v = stringify(value[k], whitelist);
                            if (v) {
                                a.push(stringify(k) + ':' + v);
                            }
                        }
                    }
                }

// Join all of the member texts together and wrap them in braces.

                return '{' + a.join(',') + '}';
            }
        }

        return {
            stringify: stringify,
            parse: function (text, filter) {
                var j;

                function walk(k, v) {
                    var i, n;
                    if (v && typeof v === 'object') {
                        for (i in v) {
                            if (Object.prototype.hasOwnProperty.apply(v, [i])) {
                                n = walk(i, v[i]);
                                if (n !== undefined) {
                                    v[i] = n;
                                }
                            }
                        }
                    }
                    return filter(k, v);
                }


// Parsing happens in three stages. In the first stage, we run the text against
// regular expressions that look for non-JSON patterns. We are especially
// concerned with '()' and 'new' because they can cause invocation, and '='
// because it can cause mutation. But just to be safe, we want to reject all
// unexpected forms.

// We split the first stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace all backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

                if (/^[\],:{}\s]*$/.test(text.replace(/\\./g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

// In the second stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

                    j = eval('(' + text + ')');

// In the optional third stage, we recursively walk the new structure, passing
// each name/value pair to a filter function for possible transformation.

                    return typeof filter === 'function' ? walk('', j) : j;
                }

// If the text is not JSON parseable, then a SyntaxError is thrown.

                throw new SyntaxError('parseJSON');
            }
        };
    }();
}

function getFromQuery(VariableName)
{
	var QueryString = location.search.toString() + "\n";
	var RegEx = new RegExp( "[\?\&]"+ VariableName +"=(.*?)[&\n]", "gi" );
	var Matches = RegEx.exec(QueryString);
	return (Matches) ? Matches[1] : "";
}

function setCookie(CookieName, Value, ExpireDays)
{
	var ExpireOnDate = new Date();
	ExpireOnDate.setDate( ExpireOnDate.getDate() + parseInt(ExpireDays) );
	var CookieString = CookieName + "=" + escape(Value) + 
		"; path=/" + 
		( (ExpireDays==null) ? "" : "; expires="+ ExpireOnDate.toGMTString() );
	document.cookie = CookieString;
}

function getCookie(CookieName)
{
	var Value = "";
	if (document.cookie.length > 0)
	{
		var Cookies = document.cookie.toString() + "\n";
		var RegEx = new RegExp( CookieName +"=(.*?)[;\n]", "gi" );
		var Matches = RegEx.exec(Cookies);
		if( Matches )
			Value = unescape(Matches[1]);
	}
	return Value;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	allows instant window.onload function execution
	(c) Dean Edwards/Matthias Miller/John Resig/Rob Chenny
	http://www.cherny.com/demos/onload/domloaded.js
	
	Calling:

	DomLoaded.load(FUNCTION_NAME);

	or

	DomLoaded.load( function() {
		...
	});
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

var DomLoaded = {
	onload: [],
	loaded: function() {
		if (arguments.callee.done) return;
		arguments.callee.done = true;
		for (var i=0; i<DomLoaded.onload.length; i++) DomLoaded.onload[i]();
	},
	load: function(fireThis) {
		this.onload.push(fireThis);
		if (document.addEventListener) 
			document.addEventListener("DOMContentLoaded", DomLoaded.loaded, null);
		if (/KHTML|WebKit/i.test(navigator.userAgent)) { 
			var _timer = setInterval(function() {
				if (/loaded|complete/.test(document.readyState)) {
					clearInterval(_timer);
					delete _timer;
					DomLoaded.loaded();
				}
			}, 10);
		}
		/*@cc_on @*/
		/*@if (@_win32)
		var proto = "src='javascript:void(0)'";
		if (location.protocol == "https:") proto = "src=//0";
		document.write("<scr"+"ipt id=__ie_onload defer " + proto + "><\/scr"+"ipt>");
		var script = document.getElementById("__ie_onload");
		script.onreadystatechange = function() {
		    if (this.readyState == "complete") {
		        DomLoaded.loaded();
		    }
		};
		/*@end @*/
	   window.onload = DomLoaded.loaded;
	}
};

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Viewport.js - fetch dimensions of viewport (usable part of browser window)
	ver 1.0 (Mar, 2008)
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2008, Aleksandar Vaciæ
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

//	this will create the Viewport object...
var Viewport = function() {
	var self = this;
	var _width = null;
	var _height = null;

	//	useful to use on page.load or window.resize. then use Viewport.Width and Viewport.Height
	this.Init = function() {
		_getDimensions();
		self.Width = _width;
		self.Height = _height;
	};

	//	call these two as Viewport.Width and Viewport.Height to get the size. in this case, _getDimensions() is called only the first time and value is reused later
	this.Width = function() {
		if (_width == null) _getDimensions();
		return _width;
	}();
	
	this.Height = function() {
		if (_height == null) _getDimensions();
		return _height;
	}();

	//	call these two to always re-read and get the latest value. use when you want to be 100% that you have the correct value (i.e. if user has resized the window in the meantime)
	this.GetWidth = function() {
		_getDimensions();
		self.Width = _width;
		return _width;
	};

	this.GetHeight = function() {
		_getDimensions();
		self.Height = _height;
		return _height;
	};

	//	internal method that actually does the job
	function _getDimensions(sWhat) {
		// the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
		if (typeof(window.innerWidth) != 'undefined') {
			_width = window.innerWidth;
			_height = window.innerHeight;
		}
		// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
		else if (typeof(document.documentElement) != 'undefined' && typeof(document.documentElement.clientWidth) != 'undefined' && document.documentElement.clientWidth != 0) {
			_width = document.documentElement.clientWidth;
			_height = document.documentElement.clientHeight;
		}
		// older versions of IE
		else if (typeof(document.body) != 'undefined' && typeof(document.body.clientWidth) != 'undefined') {
			_width = document.body.clientWidth;
			_height = document.body.clientHeight;
		}
	}
	
	return this;
}();	//...and this () will immediatelly execute it.

/*
	If DOMLoaded is present, re-measure on DOM load, so that proper dimensions are fetched in IE.
	Why?
		IE will always render the vertical scrollbars, even when they are not needed.
		If this script is loaded in the HEAD, then scollbars will not be rendered yet and the value measured will be larger than what is actually available.
		It's not possible to get the scrollbar size, thus we need to do re-measure on page load or better yet on DOM load
	However, if Viewport.js is loaded at the end of the BODY element instead of in the HEAD, then this call is not necessary (see tests/Viewport2.html),
	thus we check for the existence of BODY element. if it's defined, it means that script is loaded inside the BODY
*/
if (document && 
	document.getElementsByTagName("body") && 
	typeof(document.getElementsByTagName("body")[0]) == "undefined" &&
	typeof(DomLoaded) != "undefined"
) DomLoaded.load(Viewport.Init);


/*
 * 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")}})})();
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Browser Detect Lite  v2.1.4
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	http://www.dithered.com/javascript/browser_detect/index.html
	modified by Chris Nott (chris@NOSPAMdithered.com - remove NOSPAM)
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	stripped-down version.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BrowserDetectLite() {
   var ua = navigator.userAgent.toLowerCase(); 
   this.isGecko     = (ua.indexOf('gecko') != -1 && ua.indexOf('like') == -1);
   this.isKHTML     = (ua.indexOf('khtml') != -1);
   this.isIE        = ( (ua.indexOf('msie') != -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) ); 
   this.isMac   = (ua.indexOf('mac') != -1);
}
var Browser = new BrowserDetectLite();

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	FormValidation.js - library contains code to validate HTML form-field data.
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	The bulk of this file was derived from Eric Krock's FormCheck.js at developer.netscape.com/docs/examples/javascript/formval/overview.html
	(Many thanks, Eric!) Enjoy ... and please maintain this header. Also thanks to Rick Scott who further developed this library
	(c) 1997 Netscape Communications Corporation
	(c) Copyright 2000, Rick Scott.
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2002 Aleksandar Vacic, aleck@sezampro.yu, www.aplus.co.yu
	## This work is licensed under the Creative Commons Attribution-ShareAlike License.
	## To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	- added "namespace" FV for easier integration for other scripts
	- removed some string-munching functions from Rick's version
	- some functions renamed to shorter names (like FV_Trim to Trim)
	- removed all checks for letters since it works only with English language. Language independent functions needed. Time (for it) needed.
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	stripped-down version.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

var FV_sDigits = "0123456789";
var FV_sBlanks = " \t\n\r";	// aka whitespace chars
var FV_sDecimalPointDelimiter = "."; // decimal point character differs by language and culture

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Returns true if string s is empty
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsEmpty(s){
	return ((s == null) || (s.length == 0));
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Returns true if string s is empty or all blank chars
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsBlank(s){
	var i;
	var c;

	// Is s empty?
	if (FV_IsEmpty(s))
		return true;

	// Search through string's chars one by one until we find first non-blank char, then return false; if we don't, return true
	for (i=0; i<s.length; i++){	 
		// Check that current character isn't blank
		c = s.charAt(i);
		if (FV_sBlanks.indexOf(c) == -1) 
			return false;
	}

	// All characters are blank
	return true;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Removes all characters which do NOT appear in string bag from string s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_StripCharsNotInBag(s, bag){
	var i;
	var c;
	var returnString = "";

	//	if bag is empty, no checks, just return input string
	if (bag == "") return s;

	// Search through string's characters one by one; if character is in bag, append to returnString
	for (i = 0; i < s.length; i++){	 
		// Check that current character isn't blank
		c = s.charAt(i);
		if (bag.indexOf(c) != -1) 
			returnString += c;
	}

	return returnString;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Removes leading blank chars (as defined by FV_sBlanks) from s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_LTrim(s){ 
	var i = 0;
	while ((i < s.length) && (FV_sBlanks.indexOf(s.charAt(i)) != -1))
		 i++;
	return s.substring(i, s.length);
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Removes trailing blank chars (as defined by FV_sBlanks) from s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_RTrim(s){ 
	var i = s.length - 1;
	while ((i >= 0) && (FV_sBlanks.indexOf(s.charAt(i)) != -1))
		 i--;
	return s.substring(0, i+1);
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Removes leading+trailing blank chars (as defined by FV_sBlanks) from s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_Trim(s){ 
	s = FV_LTrim(s);
	s = FV_RTrim(s);
	return s;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Returns true if character c is a digit (0 .. 9)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsDigit(c){
	return ((c >= "0") && (c <= "9"));
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Returns true if all chars in string s are numbers;
	first character is allowed to be + or -; does not 
	accept floating point, exponential notation, etc.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsInteger(s){
	if (FV_IsBlank(s))
		return false;

	// skip leading + or -
	if ((s.charAt(0) == "-") || (s.charAt(0) == "+"))
		var i = 1;
	else
		var i = 0;

	// Search through string's chars one by one until we find a non-numeric char, then return false; if we don't, return true
	var c;
	for (i; i<s.length; i++){	 
		// Check that current character is number
		c = s.charAt(i);
		if (!FV_IsDigit(c)) 
			return false;
	}

	// All characters are numbers
	return true;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Returns true if string s is an integer such that a <= s <= b
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsIntegerInRange(s, a, b){ 
	if (FV_IsBlank(s)) 
		return false;
	if (!FV_IsInteger(s)) 
		return false;
	var num = parseInt(s, 10);
	return ((num >= a) && (num <= b));
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	True if string s is an unsigned floating point (real) number; first character is allowed to be + or -; no exponential notation.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsFloat(s){ 
	var seenDecimalPoint = false;

	if (FV_IsBlank(s)) 
		return false;
	if (s == FV_sDecimalPointDelimiter) 
		return false;

	// skip leading + or -
	if ((s.charAt(0) == "-") || (s.charAt(0) == "+"))
		var i = 1;
	else
		var i = 0;

	// Search through string's chars one by one until we find a non-numeric char, then return false; if we don't, return true
	var c;
	for (i; i<s.length; i++){	 
		// Check that current character is number
		c = s.charAt(i);

		if ((c == FV_sDecimalPointDelimiter) && !seenDecimalPoint) 
			seenDecimalPoint = true;
		else if (!FV_IsDigit(c)) 
			return false;
	}

	// All characters are numbers
	return seenDecimalPoint;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Returns true if string is a valid email address: @ and . required, at least one char before @, at least one char before and after .
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsEmail(strEmail) {
	if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
		return true;
	else
		return false;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Returns year in	4-digit format (e.g., 2000, not 0 or 100) 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_GetYear2k(date){
	var year = date.getYear();
	if (year < 1000)
		year += 1900;
	return year;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	check if this is a valid date (no Feb 31st and similar)	- argument nJan can mi omitted, when it defaults to 0
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_IsValidDate(sYear, sMonth, sDay, nJan) {
	if (nJan != 1) nJan = 0;
	var nDec = nJan + 11;
	if ( !FV_IsInteger(sYear) || !FV_IsIntegerInRange(sMonth, nJan, nDec) || !FV_IsIntegerInRange(sDay, 1, 31) )
		 return false;	

	var nDay = parseInt(sDay, 10);
	var nMonth = parseInt(sMonth, 10) - ((nJan == 1) ? 1 : 0);
	var nYear = parseInt(sYear, 10);
	var oDate = new Date(nYear, nMonth, nDay);

	if ( nDay == oDate.getDate() && nMonth == oDate.getMonth() && nYear == FV_GetYear2k(oDate) )
		return true;

	return false;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	setup mandatory form elements for proper validation 
	XField = do not process
	sField = process as string
	nField = process as number
	bField = process as boolean (checkbox and radio state)

	mandatory fields have <label class="mandat">...
	<div class="badinput">... - indicates bad fields
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_SetupForm(vForm){
	if (typeof(vForm) == "string")
		oForm = document.forms[vForm];
	else
		oForm = vForm;

	if (!oForm) return;

	//	ditch non-supporting browsers
	if (!oForm.parentNode) return;

	//	set onsubmit validation function
	oForm.onsubmit = function() {
		return FV_FormVal(this);
	};

	//	flag. if true, alert box will be shown on bad input 
	oForm.alertuser = false;

	//	flag to prevent multiple submits
	oForm.submitted = false; 

	var oElems = oForm.elements; 
	var nLen = oElems.length;
	var sTmp, oTmp, sTmp2;
	for (var i=0; i<nLen; i++) {
		oTmp = oElems[i];
		//	skip elements that don't have names (usually fieldset)
		if (typeof(oTmp.name) == "undefined") continue;

		sTmp2 = oTmp.name;
		sTmp = sTmp2.charAt(0).toLowerCase();
		//	process elements with names starting with b, s and n 
		if (sTmp != "b" && sTmp != "s" && sTmp != "n") continue;

		switch(oTmp.type) {
			case "text": case "select-one": case "password": case "textarea": 
				oLabels = oTmp.parentNode.getElementsByTagName("label");
				for (var j=0;j<oLabels.length;j++) {
					if (oLabels[j].className.indexOf("mandat") != -1 && oLabels[j].htmlFor == sTmp2) {
						oTmp.valme = function() {
							var oDiv = this.parentNode;

							if (this.type == "text")
								this.value = FV_Trim(this.value);

							bOk = FV_FieldVal(this);

							if (bOk)
								oDiv.className = oDiv.className.replace("badinput", "");
							else if (oDiv.className.indexOf("badinput") == -1) {
								oDiv.className += " badinput";
							}
							return bOk;
						};
						oTmp.onblur = oTmp.valme;
						break;			
					} 		
				}
				break; 		

			case "checkbox":				
				oLabel = oTmp.parentNode;
				if (oLabel.className.indexOf("mandat") != -1) {
	  				oTmp.valme = function(bShowMes) {
	  					var oDiv = this.parentNode.parentNode;
	
	  					var bOk = this.checked;
	
						if (!bOk) FV_FieldVal(this);

	  					if (bOk)
	  						oDiv.className = oDiv.className.replace("badinput", "");
	  					else if (oDiv.className.indexOf("badinput") == -1) {
	  						oDiv.className += " badinput";
	  						if (this.form.alertuser) FV_FieldVal(this);
	  					}
	  					return bOk;
	  				};
					oTmp.onblur = oTmp.valme;
				}
				break; 		

			case "radio":
				oLabel = oTmp.parentNode;
				if (oLabel.className.indexOf("mandat") != -1) {
					oTmp.valme = function(bShowMes) {
						var oDiv = this.parentNode.parentNode;

						var oRadios = this.form.elements[this.name];
						var bOk = false;
						for (var r=0;r<oRadios.length;r++) {
							if (oRadios[r].checked) {
								bOk = true; 
								break; 
							}
							FV_FieldVal(this);
						}

						if (bOk)
							oDiv.className = oDiv.className.replace("badinput", "");
						else if (oDiv.className.indexOf("badinput") == -1) {
							oDiv.className += " badinput";
	  						if (this.form.alertuser) FV_FieldVal(this);
						}
						return bOk;
					};
					oTmp.onblur = oTmp.valme;
				} 		
				break; 		
				
		}//switch oTmp.type
	}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	handler function for specific fields		
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FV_ShowMessage(sMes) {
	if (sMes != "")
		alert(sMes);
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	FiF.js - Floating IFrame v3.1
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2003, Aleksandar Vacic, aleck@sezampro.yu, www.aplus.co.yu
	## This work is licensed under the Creative Commons Attribution License.
	## To view a copy of this license, visit http://creativecommons.org/licenses/by/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Works in:
	- IE5+ (Win and Mac)
	- Firefox 1.0+
	- Opera 7.5+
	- Safari 1+
	- OmniWeb 5.0+

	Dependencies: 
	- x.js
	- DomLoaded.js
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

var FIF_Index = 0;
var FIF_IFrame = new Array();

function FIF_Frame( top, left, width, height, src, bIsStealth ) {
	//	deny all non-DOM browsers
	if (!document.getElementById && !document.documentElement && !document.getElementsByTagName) return null;
	
	var self = this;
	bIsStealth = (bIsStealth == true);

	//	some needed browser-detection
	var _sUA = navigator.userAgent.toLowerCase(); 
	var _bIsGecko = (_sUA.indexOf("gecko") != -1);	//	this works for KHTML-based too, since they have "like gecko" string in UAs (at least Safari and OmniWeb have)
	var _bIsMacIE = (_sUA.indexOf("mac") != -1 && _sUA.indexOf("msie") != -1);

	this.nTop = top;
	this.nLeft = left;
	this.nWidth = width;
	this.nHeight = height;
	this.sSrc = src;
	this.sID = FIF_Index;
	this.sName = "FIF_frame" + FIF_Index;
	this.bIsStealth = bIsStealth;
	this.oOpener = window;
	this.URLlimit = 1200;

	//	this loads passed URL in iFrame. has a bunch of browser tweaks, due to their inconsistency, bugs, and general lack of standard support.
	//	current time (FIFTime) is added to avoid page caching
	this.Load = function(sSrc) {
		sSrc = sSrc || self.sSrc;
		
		//	prepare cache hack
		var dTemp = new Date();
		var sTmp = "";
		if (sSrc.indexOf("?") != -1)
			sTmp += "&";
		else
			sTmp += "?";
		sTmp += "FIFTime=" + dTemp.getTime();

		if (sSrc.length < self.URLlimit-sTmp.length) {
			//	simple load of new document
			try {
				self.layer.src = sSrc + sTmp;
			} catch(exception) {
				if (self.layer) {
					if (self.layer.location)
						self.layer.location.href = sSrc + sTmp;
				} else if (document.frames && document.frames["FIF_frame" + self.sID]) {
					if (document.frames["FIF_frame" + self.sID].location)
						document.frames["FIF_frame" + self.sID].location.href = sSrc + sTmp;
				} else {
					setTimeout('FIF_IFrame[' + self.sID + '].Load("' + sSrc + '")', 500);
					return false;
				}
			}
		} else {
			//	must create form that will submit the data
			var oForm = null;
			try {
				var rform = null;
				if (rform = document.getElementById('form4fif'))
					document.body.removeChild(rform);

				var nUrl = sSrc.indexOf("?");
				var sAction = sSrc.substring(0, nUrl+1) + sTmp.substring(1);
				var aQS = sSrc.substring(nUrl+1).split("&");

				var tempForm = document.createElement('form');

				tempForm.setAttribute( 'action', sAction );
				tempForm.setAttribute( 'method', "post" );
				tempForm.setAttribute( 'name', "form4fif" );
				tempForm.setAttribute( 'id', "form4fif" );
				tempForm.setAttribute( 'target', 'FIF_frame' + self.sID );

				var aTmp;
				for (var cnt=0;cnt<aQS.length;cnt++) {
					aTmp = aQS[cnt].split( "=" );
					var tempFld = document.createElement( 'input' );
					tempFld.setAttribute( 'type', 'hidden' );
					tempFld.setAttribute( 'name', aTmp[0] );
					tempFld.setAttribute( 'id', aTmp[0] );
					tempFld.setAttribute( 'value', unescape(aTmp[1]) );
					tempForm.appendChild(tempFld);
				}

				oForm = document.body.appendChild(tempForm);
				tempForm = null;
				tempFld = null;

				if (!oForm && document.forms) {
					oForm = document.forms[document.forms.length];
				}
				if (!oForm) return false;
				oForm.submit();

			} catch(exception) {	//	only IE5.Mac gets here
				//	first get the document reference inside of iframe
				self.GetDocRef();
				//	clear it out
				self.doc.body.innerHTML = "";

				//	build the form HTML
				var nUrl = sSrc.indexOf("?");
				var sForm = '<form action="' + sSrc.substring(0, nUrl+1) + sTmp.substring(1) + '" method="post" id="form4fif" name="form4fif">';

				var aQS = sSrc.substring(nUrl+1).split("&");
				var aTmp;
				for (var cnt=0;cnt<aQS.length;cnt++) {
					aTmp = aQS[cnt].split("=");
					sForm += '<input type="hidden" name="' + aTmp[0] + '" id="' + aTmp[0] + '" value="' + unescape(aTmp[1]) + '" />\n';
				}

				sForm += '</form>';
				//	append to doc
				self.doc.body.innerHTML = sForm;
				//	submit
				oForm = self.doc.forms[0];
				oForm.submit();
			}	//	try-catch

		}//	if-else

		self.sSrc = sSrc;
		return true;
	};

	if (!bIsStealth) {
		this.bIsShown = true;
		this.bIsOn = true;
	}
	this.Show = function() { xShow(this.layer); this.bIsShown = true; };
	this.Hide = function() { xHide(this.layer); this.bIsShown = false; };
	this.On = function() { xOn(this.layer); this.bIsOn = true; };
	this.Off = function() { xOff(this.layer); this.bIsOn = false; };

	this.MoveTo = function(nL, nT) { if (typeof(nL) != "undefined") this.nLeft = nL; if (typeof(nT) != "undefined") this.nTop = nT; xMoveTo(this.layer, nL, nT); };
	this.Left = function(nL) { if (typeof(nL) != "undefined") this.nLeft = nL; return xLeft(this.layer, nL); };
	this.Top = function(nT) { if (typeof(nT) != "undefined") this.nTop = nT; return xTop(this.layer, nT); };

	this.ResizeTo = function(nW, nH) { if (typeof(nW) != "undefined") this.nWidth = nW; if (typeof(nH) != "undefined") this.nHeight = nH; xResizeTo(this.layer, nW, nH); };
	this.Width = function(nW) { if (typeof(nW) != "undefined") this.nWidth = nW; return xWidth(this.layer, nW); };
	this.Height = function(nH) { if (typeof(nH) != "undefined") this.nHeight = nH; return xHeight(this.layer, nH); };

	this.PageX = function() { return xPageX(this.layer) };
	this.PageY = function() { return xPageY(this.layer) };
/*
	if ( src.indexOf("://") != -1 ) {
		if ( src.indexOf(document.domain) == -1 ) {
			alert("FloatingIFrame: Sorry, the src you specified (" + src + ") is not in this domain. You can't load URLs outside " + document.domain);
			return;
		}
	}
*/
	//	write the iframe to the page
	if (bIsStealth) {
		var sVis = 'visibility:hidden;';
	} else {
		var sVis = '';
	}

	var sTmp = '<iframe' +
	' width="' + width + '" height="' + height + '"' +
	' scrolling="yes"' +
	' frameborder="0"' +
	' name="FIF_frame' + FIF_Index + '" ' +
	' id="FIF_frame' + FIF_Index + '" ' +
	' style="position:absolute;' + sVis + 'left:' + left + 'px;top:' + top + 'px;border:1px solid #000;"' + 
	' src="' + src + '">' + 
	'</iframe>\n';
	document.write(sTmp);
	document.close();

	//	fetch the reference to the iframe
	this.layer = null;
	this.GetLayerRef = function() {
		self.layer = document.getElementById("FIF_frame" + self.sID);
	};

	//	fetch the reference to the document object inside of the layer  
	this.doc = null;
	this.bIsDocSet = false;
	this.GetDocRef = function() {
		if (!self.layer) return;
		self.doc = null;
		try {
			if (_bIsMacIE) {
				self.doc = document.frames["FIF_frame" + self.sID].document;
			} else {
				self.doc = (self.layer.contentWindow || self.layer.contentDocument);
				if (self.doc && self.doc.document) self.doc = self.doc.document;
			}
			self.bIsDocSet = true;
		} catch(exception) {
			self.bIsDocSet = false;
			setTimeout('FIF_IFrame[' + self.sID + '].GetDocRef()', 100);
		}
	};

	//	enumerate
	FIF_Index++;
	FIF_IFrame[this.sID] = this;

	//	setup references...
	this.Setup = function() {
		self.GetLayerRef();
	};

	//	...on page load
	DomLoaded.load(FIF_IFrame[this.sID].Setup);
}

var FIF_Index2 = 0;
var FIF_IFrame2 = new Array();

function FIF_Frame2( top, left, width, height, src, bIsStealth ) {
	//	deny all non-DOM browsers
	if (!document.getElementById && !document.documentElement && !document.getElementsByTagName) return null;
	
	var self = this;
	bIsStealth = (bIsStealth == true);

	//	some needed browser-detection
	var _sUA = navigator.userAgent.toLowerCase(); 
	var _bIsGecko = (_sUA.indexOf("gecko") != -1);	//	this works for KHTML-based too, since they have "like gecko" string in UAs (at least Safari and OmniWeb have)
	var _bIsMacIE = (_sUA.indexOf("mac") != -1 && _sUA.indexOf("msie") != -1);

	this.nTop = top;
	this.nLeft = left;
	this.nWidth = width;
	this.nHeight = height;
	this.sSrc = src;
	this.sID = FIF_Index2;
	this.sName = "FIF_frame2" + FIF_Index2;
	this.bIsStealth = bIsStealth;
	this.oOpener = window;
	this.URLlimit = 1200;

	//	this loads passed URL in iFrame. has a bunch of browser tweaks, due to their inconsistency, bugs, and general lack of standard support.
	//	current time (FIFTime) is added to avoid page caching
	this.Load = function(sSrc) {
		sSrc = sSrc || self.sSrc;
		
		//	prepare cache hack
		var dTemp = new Date();
		var sTmp = "";
		if (sSrc.indexOf("?") != -1)
			sTmp += "&";
		else
			sTmp += "?";
		sTmp += "FIFTime=" + dTemp.getTime();

		if (sSrc.length < self.URLlimit-sTmp.length) {
			//	simple load of new document
			try {
				self.layer.src = sSrc + sTmp;
			} catch(exception) {
				if (self.layer) {
					if (self.layer.location)
						self.layer.location.href = sSrc + sTmp;
				} else if (document.frames && document.frames["FIF_frame2" + self.sID]) {
					if (document.frames["FIF_frame2" + self.sID].location)
						document.frames["FIF_frame2" + self.sID].location.href = sSrc + sTmp;
				} else {
					setTimeout('FIF_IFrame2[' + self.sID + '].Load("' + sSrc + '")', 500);
					return false;
				}
			}
		} else {
			//	must create form that will submit the data
			var oForm = null;
			try {
				var rform = null;
				if (rform = document.getElementById('form4fif'))
					document.body.removeChild(rform);

				var nUrl = sSrc.indexOf("?");
				var sAction = sSrc.substring(0, nUrl+1) + sTmp.substring(1);
				var aQS = sSrc.substring(nUrl+1).split("&");

				var tempForm = document.createElement('form');

				tempForm.setAttribute( 'action', sAction );
				tempForm.setAttribute( 'method', "post" );
				tempForm.setAttribute( 'name', "form4fif" );
				tempForm.setAttribute( 'id', "form4fif" );
				tempForm.setAttribute( 'target', 'FIF_frame2' + self.sID );

				var aTmp;
				for (var cnt=0;cnt<aQS.length;cnt++) {
					aTmp = aQS[cnt].split( "=" );
					var tempFld = document.createElement( 'input' );
					tempFld.setAttribute( 'type', 'hidden' );
					tempFld.setAttribute( 'name', aTmp[0] );
					tempFld.setAttribute( 'id', aTmp[0] );
					tempFld.setAttribute( 'value', unescape(aTmp[1]) );
					tempForm.appendChild(tempFld);
				}

				oForm = document.body.appendChild(tempForm);
				tempForm = null;
				tempFld = null;

				if (!oForm && document.forms) {
					oForm = document.forms[document.forms.length];
				}
				if (!oForm) return false;
				oForm.submit();

			} catch(exception) {	//	only IE5.Mac gets here
				//	first get the document reference inside of iframe
				self.GetDocRef();
				//	clear it out
				self.doc.body.innerHTML = "";

				//	build the form HTML
				var nUrl = sSrc.indexOf("?");
				var sForm = '<form action="' + sSrc.substring(0, nUrl+1) + sTmp.substring(1) + '" method="post" id="form4fif" name="form4fif">';

				var aQS = sSrc.substring(nUrl+1).split("&");
				var aTmp;
				for (var cnt=0;cnt<aQS.length;cnt++) {
					aTmp = aQS[cnt].split("=");
					sForm += '<input type="hidden" name="' + aTmp[0] + '" id="' + aTmp[0] + '" value="' + unescape(aTmp[1]) + '" />\n';
				}

				sForm += '</form>';
				//	append to doc
				self.doc.body.innerHTML = sForm;
				//	submit
				oForm = self.doc.forms[0];
				oForm.submit();
			}	//	try-catch

		}//	if-else

		self.sSrc = sSrc;
		return true;
	};

	if (!bIsStealth) {
		this.bIsShown = true;
		this.bIsOn = true;
	}
	this.Show = function() { xShow(this.layer); this.bIsShown = true; };
	this.Hide = function() { xHide(this.layer); this.bIsShown = false; };
	this.On = function() { xOn(this.layer); this.bIsOn = true; };
	this.Off = function() { xOff(this.layer); this.bIsOn = false; };

	this.MoveTo = function(nL, nT) { if (typeof(nL) != "undefined") this.nLeft = nL; if (typeof(nT) != "undefined") this.nTop = nT; xMoveTo(this.layer, nL, nT); };
	this.Left = function(nL) { if (typeof(nL) != "undefined") this.nLeft = nL; return xLeft(this.layer, nL); };
	this.Top = function(nT) { if (typeof(nT) != "undefined") this.nTop = nT; return xTop(this.layer, nT); };

	this.ResizeTo = function(nW, nH) { if (typeof(nW) != "undefined") this.nWidth = nW; if (typeof(nH) != "undefined") this.nHeight = nH; xResizeTo(this.layer, nW, nH); };
	this.Width = function(nW) { if (typeof(nW) != "undefined") this.nWidth = nW; return xWidth(this.layer, nW); };
	this.Height = function(nH) { if (typeof(nH) != "undefined") this.nHeight = nH; return xHeight(this.layer, nH); };

	this.PageX = function() { return xPageX(this.layer) };
	this.PageY = function() { return xPageY(this.layer) };
/*
	if ( src.indexOf("://") != -1 ) {
		if ( src.indexOf(document.domain) == -1 ) {
			alert("FloatingIFrame: Sorry, the src you specified (" + src + ") is not in this domain. You can't load URLs outside " + document.domain);
			return;
		}
	}
*/
	//	write the iframe to the page
	if (bIsStealth) {
		var sVis = 'visibility:hidden;';
	} else {
		var sVis = '';
	}

	var sTmp = '<iframe' +
	' width="' + width + '" height="' + height + '"' +
	' scrolling="yes"' +
	' frameborder="0"' +
	' name="FIF_frame2' + FIF_Index2 + '" ' +
	' id="FIF_frame2' + FIF_Index2 + '" ' +
	' style="position:absolute;' + sVis + 'left:' + left + 'px;top:' + top + 'px;border:1px solid #000;"' + 
	' src="' + src + '">' + 
	'</iframe>\n';
	document.write(sTmp);
	document.close();

	//	fetch the reference to the iframe
	this.layer = null;
	this.GetLayerRef = function() {
		self.layer = document.getElementById("FIF_frame2" + self.sID);
	};

	//	fetch the reference to the document object inside of the layer  
	this.doc = null;
	this.bIsDocSet = false;
	this.GetDocRef = function() {
		if (!self.layer) return;
		self.doc = null;
		try {
			if (_bIsMacIE) {
				self.doc = document.frames["FIF_frame2" + self.sID].document;
			} else {
				self.doc = (self.layer.contentWindow || self.layer.contentDocument);
				if (self.doc && self.doc.document) self.doc = self.doc.document;
			}
			self.bIsDocSet = true;
		} catch(exception) {
			self.bIsDocSet = false;
			setTimeout('FIF_IFrame2[' + self.sID + '].GetDocRef()', 100);
		}
	};

	//	enumerate
	FIF_Index2++;
	FIF_IFrame2[this.sID] = this;

	//	setup references...
	this.Setup = function() {
		self.GetLayerRef();
	};

	//	...on page load
	DomLoaded.load(FIF_IFrame2[this.sID].Setup);
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Flash.js - Flash handling library. For writing in-page Flash movies
	ver 2.3, Jul 12,2005
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2005, Aleksandar Vacic, www.aplus.co.yu
	## This work is licensed under the Creative Commons BY-2.0 license
	## To view a copy of this license, visit http://creativecommons.org/licenses/by/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

<!--[if IE]>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
	codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"
	width="269" height="34">
<param name="movie" value="assets/countdown_greatbritain.swf" />
<param name="wmode" value="transparent" />
<param name="quality" value="high" />
<img src="assets/countdown_greatbritain.gif" 
	width="269" height="34"
	alt="Countdown to British GP - you need Flash to see it" border="0" />
</object>
<![endif]-->

<!--[if !IE]> <-->
<object data="assets/countdown_greatbritain.swf"
	type="application/x-shockwave-flash"
	width="269" height="34">
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="pluginurl" value="http://www.macromedia.com/go/getflashplayer" />
<img src="assets/countdown_greatbritain.gif" 
	width="269" height="34" 
	alt="Countdown to British GP - you need Flash to see it" border="0" />
</object>
<!--> <![endif]-->

	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Flash Version Detector  v1.2.1
	documentation: http://www.dithered.com/javascript/flash_detect/index.html
	license: http://creativecommons.org/licenses/by/1.0/
	code by Chris Nott (chris[at]dithered[dot]com)
	with VBScript code from Alastair Hamilton (now somewhat modified)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

var SWF_bUseFlash = true;

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	VBScript function for IE ActiveX check
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var SWF_IE = '<scr' + 'ipt language="VBScript"\> \n';
SWF_IE += 'Function SWF_Check4FlashVerIE(sVer) \n';
SWF_IE += 'On Error Resume Next \n';
SWF_IE += 'Dim obFlash, bRet \n';
SWF_IE += 'bRet = False \n';
SWF_IE += '   Set obFlash = CreateObject("ShockwaveFlash.ShockwaveFlash." & Left(sVer, 1)) \n';
SWF_IE += '   If IsObject(obFlash) Then bRet = True \n';
SWF_IE += 'SWF_Check4FlashVerIE = bRet \n';
SWF_IE += 'End Function \n';
SWF_IE += '</scr' + 'ipt\> \n';
document.write(SWF_IE);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	this checks for specific version 	
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SWF_Check4FlashVer(sVer) {
	var agent = navigator.userAgent.toLowerCase(); 
	
	// NS3 needs SWF_FlashVer to be a local variable
	if (agent.indexOf("mozilla/3") != -1 && agent.indexOf("msie") == -1) {
		return false;
	}
   
	// NS3+, Opera3+, IE5+ Mac (support plugin array):  check for Flash plugin in plugin array
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		var flashPlugin = navigator.plugins['Shockwave Flash'];
		if (typeof(flashPlugin) == 'object') { 
			var nTmp = parseFloat( flashPlugin.description.substring(16).replace(/\s+/gi, "").replace(/r/gi, "") );
			sVer = sVer.replace(/,/gi, "");
			sVer = sVer.charAt(0) + "." + sVer.substring(1); 
			var nVer = parseFloat(sVer);
            if (nTmp >= nVer)
				return true;
		}
	}

	// IE4+ Win32:  attempt to create an ActiveX object using VBScript
	else if (agent.indexOf("msie") != -1 && parseInt(navigator.appVersion) >= 4 && agent.indexOf("win")!=-1 && agent.indexOf("16bit")==-1) {
		return SWF_Check4FlashVerIE(sVer);
	}
		
	// Can't detect in all other cases
	else {
		return false;
	}

	return false;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	this tries to detect the version	
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SWF_GetFlashVer() {
	var latestFlashVersion = 10;
	var agent = navigator.userAgent.toLowerCase(); 
	
	// NS3 needs SWF_FlashVer to be a local variable
	if (agent.indexOf("mozilla/3") != -1 && agent.indexOf("msie") == -1) {
		SWF_FlashVer = 0;
	}
   
	// NS3+, Opera3+, IE5+ Mac (support plugin array):  check for Flash plugin in plugin array
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		var flashPlugin = navigator.plugins['Shockwave Flash'];
		if (typeof flashPlugin == 'object') { 
			for (var i = latestFlashVersion; i >= 3; i--) {
            if (flashPlugin.description.indexOf(i + '.') != -1) {
               SWF_FlashVer = i;
               break;
            }
         }
		}
	}

	// IE4+ Win32:  attempt to create an ActiveX object using VBScript
	else if (agent.indexOf("msie") != -1 && parseInt(navigator.appVersion) >= 4 && agent.indexOf("win")!=-1 && agent.indexOf("16bit")==-1) {
		var doc = '<scr' + 'ipt language="VBScript"\> \n';
		doc += 'On Error Resume Next \n';
		doc += 'Dim obFlash \n';
		doc += 'For i = ' + latestFlashVersion + ' To 3 Step -1 \n';
		doc += '   Set obFlash = CreateObject("ShockwaveFlash.ShockwaveFlash." & i) \n';
		doc += '   If IsObject(obFlash) Then \n';
		doc += '      SWF_FlashVer = i \n';
		doc += '      Exit For \n';
		doc += '   End If \n';
		doc += 'Next \n';
		doc += '</scr' + 'ipt\> \n';
		document.write(doc);
	}
		
	// WebTV 2.5 supports flash 3
	else if (agent.indexOf("webtv/2.5") != -1) SWF_FlashVer = 3;

	// older WebTV supports flash 2
	else if (agent.indexOf("webtv") != -1) SWF_FlashVer = 2;

	// Can't detect in all other cases
	else {
		SWF_FlashVer = -1;
	}

	return SWF_FlashVer;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	function for Flash write
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SWF_WriteFlashContent(sFileName, nWidth, nHeight, sAltExt, sLink, bNoAlt, sProtocol, sSiteAddr, sVer) {
	var sWriteContent = "";
	var sFlashContent = "";
	var sAlternateContent = "";
	
	if (typeof(sLink) == "undefined")
		sLink = "";

	if (typeof(bNoAlt) == "undefined")
		bNoAlt = false;

	if (typeof(sVer) == "undefined")
		sVer = "6,0,0,0";

	if (typeof(sProtocol) == "undefined")
		sProtocol = "http://";

	if (typeof(sSiteAddr) == "undefined" || sSiteAddr == "" || sSiteAddr == "/")
		sSiteAddr = sProtocol + location.host + "/";

	if (typeof(sAltExt) == "undefined")
		sAltExt += '.gif" ';

	if (!SWF_Check4FlashVer(sVer))
		SWF_bUseFlash = false;

	if (SWF_bUseFlash) {

		if (!bNoAlt) {
			sAlternateContent += '\n';
			if (sLink != "") {
				sAlternateContent += '<a href="' + sLink + '">';
			}
			sAlternateContent += '<img src="' + sFileName.replace(".swf", "") + sAltExt + '" ';
			if ( typeof(nWidth) != "undefined" )
				sAlternateContent += ' width="' + nWidth + '" ';
			if ( typeof(nHeight) != "undefined" )
				sAlternateContent += ' height="' + nHeight + '" ';
			sAlternateContent += ' border="0" />';
			if (sLink != "")
				sAlternateContent += '</a>';
		}

		//	fix the filename for data attribute of the object tag
		var sFixedFileName = sFileName;
		if (sFileName.charAt(0) == "/")
			sFixedFileName = sFileName.substring(1);
		else {
			sFixedFileName = location.pathname.substring(1, location.pathname.lastIndexOf("/") + 1) + sFileName; 
		}

		sFlashContent += '\n<!--[if IE]>';
		sFlashContent += '\n<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';
		sFlashContent += ' codebase="' + sProtocol + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + sVer + '"';
		if ( typeof(nWidth) != "undefined" )
			sFlashContent += ' width="' + nWidth + '" ';
		if ( typeof(nHeight) != "undefined" )
			sFlashContent += ' height="' + nHeight + '" ';
		sFlashContent += '>';
		sFlashContent += '\n<param name="movie" value="' + sFileName;
		if (sLink != "")
			sFlashContent += '?blink=' + escape(sLink);
		sFlashContent += '" />';
		sFlashContent += '\n<param name="wmode" value="transparent" />';
		sFlashContent += '\n<param name="quality" value="high" />';
		sFlashContent += sAlternateContent;
		sFlashContent += '\n</object>';
		sFlashContent += '\n<![endif]-->';

		sFlashContent += '\n<!--[if !IE]> <-->';
		sFlashContent += '\n<object data="' + sSiteAddr + sFixedFileName;
		if (sLink != "")
			sFlashContent += '?blink=' + escape(sLink);
		sFlashContent += '" type="application/x-shockwave-flash"';
		if ( typeof(nWidth) != "undefined" )
			sFlashContent += ' width="' + nWidth + '" ';
		if ( typeof(nHeight) != "undefined" )
			sFlashContent += ' height="' + nHeight + '" ';
		sFlashContent += '>';
		sFlashContent += '\n<param name="quality" value="high" />';
		sFlashContent += '\n<param name="wmode" value="transparent" />';
		sFlashContent += '\n<param name="pluginurl" value="http://www.macromedia.com/go/getflashplayer" />';
		sFlashContent += sAlternateContent;
		sFlashContent += '\n</object>';
		sFlashContent += '\n<!--> <![endif]-->';
	}

	if ( SWF_bUseFlash ) {
		sWriteContent = sFlashContent;
	} else {
		sWriteContent = sAlternateContent;
	}

	return sWriteContent;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	x.js - X-DOM, modification of cross-browser DHTML Library from Cross-Browser.com
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Copyright (c) 2002, 2003 Michael Foster (mike@cross-browser.com)
	This library is distributed under the terms of the LGPL (gnu.org)
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	This DOM-only version by Aleksandar Vacic, www.aplus.co.yu
	- works only with DOM compatible browsers
	- Event part of the library removed
	- functions don't check for argument lengths, but whether arguments are defined (passed)
	- xPageX and xPageY don't call xParent, they directly use e.offset* (since calculation is solely based on .offset* properties)
	- added function xGetAnyCS which returns any computed style property
	- added xOn, xOff, which toggles display property. also xIsOn and xIsShown which checks if element is displayed, visible
	- added xStick and xStickScroll (based on code by Peter Paul Koch) - layer will follow user while he scrolls down
	- added xGetAnySP which return style property, either from DOM or CSS
	- added xContX and xContY which calculate offset up to first parent (container) which has position relative or absolute
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	stripped-down version.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Variables
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var xOp7 = false, xIE = false, xUA = navigator.userAgent.toLowerCase();
if (window.opera) {
	xOp7 = ( xUA.indexOf("opera 7") != -1 || xUA.indexOf("opera/7") != -1 );
} else {
	xIE = ( xUA.indexOf("msie") != -1 );
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Appearance
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function xOn(e, sV) {
	if ( !(e = xGetElementById(e)) ) return;
	if ( xDef(sV) )
		e.style.display = sV;
	else
		e.style.display = "block";
}
function xOff(e) {
	if ( !(e = xGetElementById(e)) ) return;
	e.style.display = "none";
}
function xIsOn(e) {
	if ( !(e = xGetElementById(e)) ) return;
	var bRet = true;
	if (e.style.display == "") {
		bRet = !(xGetAnyCS(e, "display") == "none");
	} else {
		bRet = !(e.style.display == "none");
	}
	return bRet;
}
function xShow(e) {
	if ( !(e = xGetElementById(e)) ) return;
	e.style.visibility = "visible"; // v3.12, e.style.visibility='inherit';
}
function xHide(e) {
	if ( !(e = xGetElementById(e)) ) return;
	e.style.visibility = "hidden";
}
function xIsShown(e) {
	if ( !(e = xGetElementById(e)) ) return;
	var bRet = true;
	if (e.style.visibility == "")
		bRet = !(xGetAnyCS(e, "visibility") == "hidden");
	else
		bRet = !(e.style.visibility == "hidden");
	return bRet;
}
function xZIndex(e, uZ) {
	if ( !(e = xGetElementById(e)) ) return 0;
	if ( xDef(uZ) )
		e.style.zIndex = uZ;
    else
		uZ = e.style.zIndex;
	return uZ;
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Position
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function xMoveTo(e, iX, iY) {
	xLeft(e,iX);
	xTop(e,iY);
}
function xLeft(e, iX) {
	if ( !(e = xGetElementById(e)) ) return 0;
    if ( xDef(iX) )
		e.style.left = iX + "px";
	else {
    	if ( xDef(e.offsetLeft) )
			iX = e.offsetLeft; // v3.12
		else
			iX = parseInt(e.style.left);
    	if (isNaN(iX))
			iX = 0;
	}
	return iX;
}
function xTop(e, iY) {
	if ( !(e = xGetElementById(e)) ) return 0;
    if ( xDef(iY) )
		e.style.top = iY + "px";
	else {
		if ( xDef(e.offsetTop) )
			iY = e.offsetTop; // v3.12
		else
			iY = parseInt(e.style.top);
		if (isNaN(iY))
			iY = 0;
	}
	return iY;
}
function xPageX(e) {
	if ( !(e = xGetElementById(e)) ) return 0;
	var x = 0;
	while (e) {
		if ( xDef(e.offsetLeft) ) x += e.offsetLeft;
		else break;
		e = e.offsetParent;
	}
	return x;
}
function xPageY(e) {
	if ( !(e = xGetElementById(e)) ) return 0;
	var y = 0;
	while (e) {
		if ( xDef(e.offsetTop) ) y += e.offsetTop;
		else break;
		e = e.offsetParent;
	}
	return y;
}

function xStick(e) {
	if ( !(e = xGetElementById(e)) ) return;

	if ( !xDef(e.stick) ) {
		e.stick = false;
		e.stickOldPos = 0;
		e.stickStart = xTop(e);
		e.stickSub = xPageY(e) - e.stickStart;
		e.style.position = "absolute";
	}
	e.stick = (e.stick) ? false : true;
	if ( !e.stick ) {
		clearTimeout(e.stickTimer);
	}
}
function xStickScroll(e) {
	if ( !(e = xGetElementById(e)) ) return;

	var nPos;
	if (e.stick) {
		nPos = xScrollTop();
		if ( nPos < e.stickSub+e.stickStart )
			nPos = e.stickStart;
		else
			nPos -= e.stickSub;
		if ( nPos != e.stickOldPos )
			xTop( e, nPos );
		e.stickOldPos = nPos;
		e.stickTimer = setTimeout("xStickScroll('" + e.id + "')", 300);
	}
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Size
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function xResizeTo(e, uW, uH) {
	xWidth(e,uW);
	xHeight(e,uH);
}
function xWidth(e, uW) {
	if ( !e || (uW && uW<0) ) return 0;
	if ( xDef(uW) ) {
		uW = Math.round(uW);
		xSetCW(e, uW);
	}
	uW = e.offsetWidth;
	return uW;
}
function xHeight(e, uH) {
	if ( !e || (uH && uH<0) ) return 0;
	if ( xDef(uH) ) {
		uH = Math.round(uH);
		xSetCH(e, uH);
	}
	uH=e.offsetHeight;
	return uH;
}
function xGetCS(ele,sP){
	return parseInt(document.defaultView.getComputedStyle(ele,"").getPropertyValue(sP));
}
function xSetCW(ele,uW){
	if (uW < 0) return;

	var pl=0, pr=0, bl=0, br=0;
	if ( xDef(document.defaultView) && xDef(document.defaultView.getComputedStyle) ) {
		pl = xGetCS(ele, "padding-left");
		pr = xGetCS(ele, "padding-right");
		bl = xGetCS(ele, "border-left-width");
		br = xGetCS(ele, "border-right-width");
	} else if ( xDef(ele.currentStyle, document.compatMode) ) {
		if(document.compatMode == "CSS1Compat"){
			pl = parseInt(ele.currentStyle.paddingLeft);
			pr = parseInt(ele.currentStyle.paddingRight);
			bl = parseInt(ele.currentStyle.borderLeftWidth);
			br = parseInt(ele.currentStyle.borderRightWidth);
		}
	} else if ( xDef(ele.offsetWidth, ele.style.width) ) {
		ele.style.width = uW + "px";
		pl = ele.offsetWidth - uW;
	}
	if ( isNaN(pl) ) pl=0;
	if ( isNaN(pr) ) pr=0;
	if ( isNaN(bl) ) bl=0;
	if ( isNaN(br) ) br=0;
	var cssW = uW - (pl+pr+bl+br);
	if ( isNaN(cssW) || cssW<0 )
		return;
	else
		ele.style.width = cssW + "px";
}
function xSetCH(ele, uH){
	if (uH < 0) return;

	var pt=0, pb=0, bt=0, bb=0;
	if ( xDef(document.defaultView) && xDef(document.defaultView.getComputedStyle) ) {
		pt = xGetCS(ele,"padding-top");
		pb = xGetCS(ele,"padding-bottom");
		bt = xGetCS(ele,"border-top-width");
		bb = xGetCS(ele,"border-bottom-width");
	}
	else if (xDef(ele.currentStyle,document.compatMode)) {
		if (document.compatMode == "CSS1Compat"){
			pt=parseInt(ele.currentStyle.paddingTop);
			pb=parseInt(ele.currentStyle.paddingBottom);
			bt=parseInt(ele.currentStyle.borderTopWidth);
			bb=parseInt(ele.currentStyle.borderBottomWidth);
		}
	}
	else if ( xDef(ele.offsetHeight, ele.style.height) ) {
		ele.style.height = uH + "px";
		pt = ele.offsetHeight - uH;
	}
	if ( isNaN(pt) ) pt=0;
	if ( isNaN(pb) ) pb=0;
	if ( isNaN(bt) ) bt=0;
	if ( isNaN(bb) ) bb=0;
	var cssH = uH - (pt+pb+bt+bb);
	if ( isNaN(cssH) || cssH<0 )
		return;
	else
		ele.style.height = cssH + "px";
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Object
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function xGetElementById(e) {
	if (typeof(e) != "string") return e;
	if (document.getElementById)
		e = document.getElementById(e);
	else
		e = null;
	return e;
}
function xParent(e){
	if ( !(e = xGetElementById(e)) ) return null;

	var p = null;
	if ( xDef(e.parentNode) )
		p = e.parentNode;
	else if ( xDef(e.parentElement) )
		p = e.parentElement;
	else if ( xDef(e.offsetParent) )
		p = e.offsetParent;

	return p;
}
function xDef() {
	for (var i=0; i<arguments.length; ++i) {
		if ( typeof(arguments[i]) == "undefined" )
			return false;
	}
	return true;
}
function xGetAnyCS(oEle, sProp) {
	var p = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		p = document.defaultView.getComputedStyle(oEle,'').getPropertyValue(sProp)
	} else if(oEle.currentStyle) {
		// convert css property name to object property name for IE
		var a = sProp.split('-');
		sProp = a[0];
		for (var i=1; i<a.length; ++i) {
			c = a[i].charAt(0);
			sProp += a[i].replace(c, c.toUpperCase());
		}   
		p = oEle.currentStyle[sProp];
	}
	return p;
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Window
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function xScrollLeft() {
	var offset = 0;
	if ( xDef(window.pageXOffset) )
		offset = window.pageXOffset;
	else if ( document.documentElement && document.documentElement.scrollLeft )
		offset = document.documentElement.scrollLeft;
	else if ( document.body && xDef(document.body.scrollLeft ) )
		offset = document.body.scrollLeft;
	return offset;
}
function xScrollTop() {
	var offset = 0;
	if ( xDef(window.pageYOffset) )
		offset = window.pageYOffset;
	else if ( document.documentElement && document.documentElement.scrollTop )
		offset = document.documentElement.scrollTop;
	else if ( document.body && xDef(document.body.scrollTop ) )
		offset = document.body.scrollTop;
	return offset;
}
function xClientWidth() {
	var w=0;
	if ( !window.opera && document.documentElement && document.documentElement.clientWidth ) // v3.12
		w=document.documentElement.clientWidth;
	else if ( document.body && document.body.clientWidth )
		w = document.body.clientWidth;
	return w;
}
function xClientHeight() {
	var h=0;
	if ( !window.opera && document.documentElement && document.documentElement.clientHeight ) // v3.12
		h = document.documentElement.clientHeight;
	else if ( document.body && document.body.clientHeight )
		h = document.body.clientHeight;
	return h;
}

function xGetElementsByClassName(clsName, parentEle, tagName, fn)
{
  var found = new Array();
  var re = new RegExp('\\b'+clsName+'\\b', 'i');
  var list = xGetElementsByTagName(tagName, parentEle);
  for (var i = 0; i < list.length; ++i) {
    if (list[i].className.search(re) != -1) {
      found[found.length] = list[i];
      if (fn) fn(list[i]);
    }
  }
  return found;
}
function xGetElementsByTagName(tagName, parentEle)
{
  var list = null;
  tagName = tagName || '*';
  parentEle = parentEle || document;
  if (xIE) {
    if (tagName == '*') list = parentEle.all;
    else list = parentEle.all.tags(tagName);
  }
  else if (parentEle.getElementsByTagName) list = parentEle.getElementsByTagName(tagName);
  return list || new Array();
}

/*
XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08
Code licensed under Creative Commons Attribution-ShareAlike License
http://creativecommons.org/licenses/by-sa/2.0/

AjaxConn - Finsoft's upgrade of XHConn
ver 1.2 - Aug 15 2005
*/

function AjaxConn() {
	var self = this;

	var xmlhttp, bComplete = false;
	try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
	catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
	catch (e) { try { xmlhttp = new XMLHttpRequest(); }
	catch (e) { xmlhttp = false; }}}
	if (!xmlhttp) return null;

	//	is connection free to use?
	this.bIsFree = true;
	
	//	true = async request, false = sync request
	this.bIsAsync = true;
	
	//	result returned from server
	this.responseText = "";
	this.status = "";

	//	set that connection is free to be used again. save responseText
	function _Done() {
		self.bIsFree = true;
		self.responseText = xmlhttp.responseText;
		self.status = xmlhttp.status;
		self.Done();
	}
	//	allows executing specific actions after operation has completed
	this.Done = function() {};

	this.connect = function(sMethod, sURL, sVars) {
		if (!xmlhttp) return false;
		bComplete = false;
		sMethod = sMethod.toUpperCase();
		
		this.bIsFree = false;
		this.responseText = "";
		this.status = "";

		//	Finsoft's hack for stupid IE and its caching or URLs and responses
		if (sVars && sVars != "")
			sVars += "&";
		sVars += "fh4sie=" + (new Date()).getTime();

		try {
			if (sMethod == "GET") {
				sURL += "?" + sVars;
				xmlhttp.open(sMethod, sURL, this.bIsAsync);
			} else {
				xmlhttp.open(sMethod, sURL, this.bIsAsync);
				xmlhttp.setRequestHeader("Method", "POST " + sURL + " HTTP/1.1");
				xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}
			xmlhttp.onreadystatechange = function() {
				if (xmlhttp.readyState == 4 && !bComplete) {
					bComplete = true;
					_Done();
				}
			};
			xmlhttp.send(sVars);
		} catch(z) { return false; }

		return true;
	};

	return self;
}



/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Global.js - Functions used all over the web site
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2003, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

//	string of allowed characters for username and password
var SG_sInUserAllow = "0123456789abcdefghijklmnoprstquvwxyzABCDEFGHIJKLMNOPRSTQUVWXYZ_.@";
//	referer URL
var sURLRef = "";
//	currency sign
var SG_sCurrency = "&pound;";
//	these will be defined later, for now just declare them to ease coding
var BS = null;
var LU = null;
var BE = null;

//	dummy function. candidates for removal
function InR_WriteHeader() {}
function ToggleRPTmpl() {}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	rounds number to specified number of decimals
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_Round(nNum, nNumOfDecimals) {
    var nRes1 = nNum * Math.pow(10, nNumOfDecimals);
    var nRes2 = Math.round(nRes1);
    var nRes3 = nRes2 / Math.pow(10, nNumOfDecimals);
	return nRes3;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	returns STRING which has sChar repeated nNum times
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_String(nNum, sChar) {
	var sRet = "";
	for (var i=0;i<nNum;i++)
		sRet += sChar;
	return sRet;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	returns STRING with specified number of decimal figures
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_GetNumWithDecimals(nAmount, nNumOfDecimals) {
	var sRet = "";

	if ( nAmount == null ) {
		sRet = "0." + SG_String(nNumOfDecimals,"0");
	} else {
		var nRet = SG_Round(nAmount, nNumOfDecimals);
		// Convert the number to a string
		var sRet = nRet.toString();
		// Locate the decimal point
		var decimal_location = sRet.indexOf(".");

		// Is there a decimal point?
		if (decimal_location == -1) {
			// If no, then all decimal places will be padded with 0s
			decimal_part_length = 0;
			// If decimal_places is greater than zero, tack on a decimal point
			sRet += nNumOfDecimals > 0 ? "." : "";
		} else {
			// If yes, then only the extra decimal places will be padded with 0s
			decimal_part_length = sRet.length - decimal_location - 1;
		}
		
		// Calculate the number of decimal places that need to be padded with 0s
		var pad_total = nNumOfDecimals - decimal_part_length;

		if (pad_total > 0) {
			// Pad the string with 0s
			for (var counter = 1; counter <= pad_total; counter++) 
				sRet += "0";
		}
	}

	return sRet;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	visually toggles free class. toggles the other balance as well
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_ToggleFreeClass(sFreeID, sID, bChecked) {
	if (!document.getElementById) return;

	var oFBtr = document.getElementById(sFreeID);
	var oBtr = document.getElementById(sID);
	var sClassName = "balance";
	var sFreeClassName = "balance";
	if (oFBtr && oBtr) {
		if (bChecked) {
			oFBtr.className = sFreeClassName + "on";
			oBtr.className = sClassName;
		} else {
			oFBtr.className = sFreeClassName;
			oBtr.className = sClassName + "on";
		}// bChecked
	}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	check for Free balance
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_IsFree() {
	var oForm = document.forms["login"];
	if (!oForm) return false;
	var oChk = oForm.elements["scfree"];
	if (!oChk) return false;
	var bChecked = oChk.checked;
	return bChecked;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	open pop-up window
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_ShowWin(sUrl, sName, xWidth, xHeight) {
	if (!xWidth) xWidth = 600;
	if (!xHeight) xHeight = 400;
	SG_ShowWnd(sUrl, sName, xWidth, xHeight, 1);
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	continue betting button, onClick handler
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_ContinueBetting() {
	var aForms = document.forms;
	for (var i=0;i<aForms.length;i++) {
		if (!aForms[i]) continue;

		oContBet = aForms[i].elements["xContbet"];
		if (oContBet) {
			oContBet.onclick = function() {
				this.form.onsubmit = function() { return true; };
			};
		}  
		oCancel = aForms[i].elements["xCancel"];
		if (oCancel) {
			oCancel.onclick = function() {
				this.form.onsubmit = function() { return true; };
			};
		}  
	}
}
DomLoaded.load(SG_ContinueBetting);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	calls Flash function to write-out banner	
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_WriteBanner(sFile, nW, nH, sLink) {
	//	needed to overcome mixed-content warning on SSL pages
	if (SG_bIsSSL) {
		sProtocol = "https://";
		sSiteAddress = SG_sSSLserver;
	} else {
		sProtocol = "http://";
		sSiteAddress = SG_sHTTPserver;
	}

	//	fix the link
	var sFixedLink = sLink;
	if (sLink != "") {
		if (sLink.substring(0, 6) != "http://") {
			if (sLink.charAt(0) == "/")
				sFixedLink = sLink.substring(1);
			sFixedLink = SG_sHTTPserver + sLink.substring(1);
		}
	}

	var nPos = sFile.lastIndexOf(".");
	var sFileExt = sFile.substring(nPos);

	document.write( '<div class="flashcenterer">' + SWF_WriteFlashContent(sFile, nW, nH, sFileExt, sFixedLink, false, sProtocol, sSiteAddress, "6,0,4,0") + '</div>' );
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	FAL: get length of associative array
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FS_AArrayLength(aTmp) {
	var nRet = 0;
	for (var i in aTmp)
		nRet++;
	return nRet;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	setup TeamTalk and other popup windows
	
	Usage:
	use URL in href attribute, and expand class attribute with the following values:
	sN_STR			_STR = name for popup
	bS_NUM			_NUM = 1 or 0, scrolling on/off
	nW_NUM			_NUM = popup width in pixels
	nH_NUM			_NUM = popup height in pixels
	
	bR2W_NUM		_NUM = 1 or 0, is ratio to width used true/false
	nRW_NUM			_NUM = 0 to 1, number to multiply width
	nRH_NUM			_NUM = 0 to 1, number to mulitply height
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_SetupWnd() {
	var aTmp = xGetElementsByClassName("Wnd", document, "a");
	for (var i=0;i<aTmp.length;i++) {
		aTmp[i].popupcnt = i;
		aTmp[i].onclick = function() {
			var sHref = this.href.replace("&amp;", "&");

			aClasses = this.className.split(" ");
			if (aClasses.length == 1) {
				//	if only Wnd is specified as class (no options) then replicate target="_blank"
				window.open(sHref);
			} else {
				var nW=0, nH=0;
				var nRW=1, nRH=1;
				var bHasScrollbars = 0, bIsR2W = 0;
				var sName = "";
	
				for (var j=0;j<aClasses.length;j++) {
					if ( aClasses[j].substring(0, 2) == "nW" )
						nW = parseInt( aClasses[j].substring(2), 10 );
					else if ( aClasses[j].substring(0, 2) == "nH" )
						nH = parseInt( aClasses[j].substring(2), 10 );
					else if ( aClasses[j].substring(0, 3) == "nRW" )
						nRW = parseFloat( aClasses[j].substring(3) );
					else if ( aClasses[j].substring(0, 3) == "nRH" )
						nRH = parseFloat( aClasses[j].substring(3) );
					else if ( aClasses[j].substring(0, 4) == "bR2W" ) {
						bIsR2W = parseInt( aClasses[j].substring(4) );
						if (isNaN(bIsR2W)) bIsR2W = 0;
					} else if ( aClasses[j].substring(0, 2) == "sN" )
						sName = aClasses[j].substring(2);
					else if ( aClasses[j].substring(0, 2) == "bS" ) {
						bHasScrollbars = parseInt( aClasses[j].substring(2) );
						if (isNaN(bHasScrollbars)) bHasScrollbars = 0;
					}
				}
				
				if (sName = "") sName = "FSpopwnd" + this.popupcnt;
				
				//	it's a popup, so add this identificator (used in betslip, placement)
				// before adding identificator for popup, check for the existence of anchor (#)
				var sHrefAnchor = "", aHrefParts;
				if (sHref.indexOf("#") != -1) {
					aHrefParts = sHref.split("#");
					sHref = aHrefParts[0];
					sHrefAnchor = aHrefParts[1];					
				}
				if (sHref.indexOf("?") == -1)
					sHref += "?";
				else
					sHref += "&";
				sHref += "p=1";
				if (sHrefAnchor != "")
					sHref += "#" + sHrefAnchor;
				
				SG_ShowWnd(sHref, sName, nW, nH, bHasScrollbars, nRW, nRH, bIsR2W);
			}
			return false;
		};
	}
}
DomLoaded.load(SG_SetupWnd);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	open popup windows
	sUrl is the URL to open in popup
	sName is the name of the popup wnd
	xWidth, xHeight are dimensions (optional)
	xRatioW, xRatioH are ratios (< 1, i.e. 0.8) to screen.width and screen.height
	bIsR2W = 1/true => xRatioH is ratio to xRatioW, not to xHeight
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SG_ShowWnd(sUrl, sName, xWidth, xHeight, bHasScrollbars, xRatioW, xRatioH, bIsR2W) {
	var xMax = 770, yMax=600;

	if (screen) {
		var xMax = screen.width, yMax = screen.height;
	}

	if (!xWidth) {
		if (xRatioW) xWidth = xMax * xRatioW;
		xWidth = Math.round(xWidth);
	}
	//	tweak for scrollbars
	if (bHasScrollbars) xWidth += 22;
	if (xWidth > xMax) xWidth = xMax;

	if (!xHeight) {
		if (xRatioH) xHeight = ((bIsR2W) ? xWidth * xRatioH : yMax * xRatioH);
		xHeight = Math.round(xHeight);
	}

	var xOffset = (xMax - xWidth)/2;  // distance from left
	var yOffset = (yMax - xHeight)/2;  // distance from top
	if (xOffset < 1) xOffset = 0;
	if (yOffset < 1) yOffset = 0;

	winUpdate = window.open(sUrl, sName, "width="+ xWidth.toString() + ",height="+ xHeight.toString() +",screenX=" + xOffset + ",screenY=" + yOffset + ",top=" + yOffset + ",left=" + xOffset + ",status=no,resizable=yes" + (bHasScrollbars ? ",scrollbars=yes" : "") );
	if (winUpdate.opener == null) winUpdate.opener = self;
	winUpdate.focus();
	
	return winUpdate;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	toggles classes in the group nav
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SubClassToggle(sID) {
	//	no joy for IE5.0
	if (document.all && (typeof(document.body.contentEditable) == "undefined")) return false;

	var oID = document.getElementById(sID);
	if (!oID) return false;
	
	if (oID.off) {
		oID.style.display = "block";
		oID.off = false;
	} else {
		oID.style.display = "none";
		oID.off = true;
	}
	return false;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	toggles classes in the group nav
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/


function FV_StripForbiddenCharsInBag(s, bag){
	var i;
	var c;
	var returnString = "";

	//	if bag is empty, no checks, just return input string
	if (bag == "") return s;

	// Search through string's characters one by one; if character is not in bag, append to returnString
	for (i = 0; i < s.length; i++){	 
		// Check that current character isn't blank
		c = s.charAt(i);
		if (bag.indexOf(c) == -1) 
			returnString += c;
	}

	return returnString;
}


var FBF_sAllowedChars = "0123456789abcdefghijklmnoprstquvwxyzABCDEFGHIJKLMNOPRSTQUVWXYZ'. ";
var FBF_sForbiddenChars = "=<>:;%!?()*";

function FBF_Setup() {
	var oF = document.forms["fbfform"];
	if (!oF) return;

	oF.onsubmit = function() {
		var oForm = this;
		var oKw = oForm.elements["sKeywords"];
		if (!oKw) return;
		
		var sKw = oKw.value;
		sKw = FV_StripForbiddenCharsInBag(sKw, FBF_sForbiddenChars);
		oKw.value = sKw;
	
		if (sKw.length < 3) {
			if (SG_MsgFBFInvalidKeywords != "") alert(SG_MsgFBFInvalidKeywords);
			return false;
		} else
			return true;
	};
}

DomLoaded.load(FBF_Setup);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	I18N support function
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var aFS_I18N = new Array();

function FS_I18N(sPhrase) {
	var sKey = sPhrase.replace('"','\"');
	var sValue = aFS_I18N[sKey];
	if (sValue == null || sValue == '') sValue = sPhrase;
	return sValue;
}




/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Login.js - client-side validation for login form
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2003, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	shorted version of FV_SetupForm() from FAL
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function SetupLoginForm(vForm){
	if (typeof(vForm) == "string")
		oForm = document.forms[vForm];
	else
		oForm = vForm;

	if (!oForm) return;

	//	ditch non-supporting browsers
	if (!oForm.parentNode) return;

	//	set onsubmit validation function
	oForm.onsubmit = function() {
		return LoginVal(this);
	};

	//	flag. if true, alert box will be shown on bad input 
	oForm.alertuser = false;

	//	flag to prevent multiple submits
	oForm.submitted = false; 

	var oElems = oForm.elements; 
	var nLen = oElems.length;
	var sTmp, oTmp, sTmp2;
	for (var i=0; i<nLen; i++) {
		oTmp = oElems[i];
		//	skip elements that don't have names (usually fieldset)
		if (typeof(oTmp.name) == "undefined") continue;

		sTmp2 = oTmp.name;
		sTmp = sTmp2.charAt(0).toLowerCase();
		//	process elements with names starting with b, s and n 
		if (sTmp != "b" && sTmp != "s" && sTmp != "n") continue;

		switch(oTmp.type) {
			case "text": case "password": 
				oLabels = oTmp.parentNode.getElementsByTagName("label");
				for (var j=0;j<oLabels.length;j++) {
					if (oLabels[j].className.indexOf("mandat") != -1 && (oLabels[j].htmlFor == sTmp2 || oLabels[j].firstChild == oTmp)) {
						oTmp.valme = function() {
							var oDiv = this.parentNode;

							if (this.type == "text")
								this.value = FV_Trim(this.value);

							bOk = LoginFieldVal(this);

							if (bOk)
								oDiv.className = oDiv.className.replace("badinput", "");
							else if (oDiv.className.indexOf("badinput") == -1) {
								oDiv.className += " badinput";
							}
							return bOk;
						};
						oTmp.onblur = oTmp.valme;
						break;			
					} 		
				}
				break; 		

		}//switch oTmp.type
	}
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	onsubmit function		
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function LoginVal(oForm) {
	var sTmp, oTmp, bOk = true;

	//	prevent multiple clicks on submit
	if (oForm.submitted)
		return false;

	//	inform user about mistakes
	oForm.alertuser = true;

	var oElems = oForm.elements; 
	var nLen = oElems.length;

	for (var i=0; i<nLen; i++) {
		oTmp = oElems[i]; 
		if (typeof(oTmp.valme) == "undefined") continue;
		bOk = oTmp.valme();
		if (!bOk) break; 
	}

	if (bOk) {
		oForm.submitted = true;
	} 

	return bOk;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	validation handler		
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function LoginFieldVal(oField) {
	var bOk = true;

	var sFldName = oField.name;
	var oForm = oField.form;
	var sValue = oField.value;

	switch(sFldName) {
		case "sLusername":
			bOk = (sValue.length >= nMinLenUsername && sValue.length <= nMaxLenUsername);
			if (!bOk) {
				if (oForm.alertuser) {
					FV_ShowMessage(SG_MsgLogEntUserLen);
					oForm.alertuser = false;
					oField.focus();
				}
				break;
			}
			bOk = ( SG_sInUserAllow == "" || FV_StripCharsNotInBag(sValue, SG_sInUserAllow) == sValue );
			if (!bOk) {
				if (oForm.alertuser) {
					FV_ShowMessage(SG_MsgLogEntUserChars + "\n" + SG_sInUserAllow);
					oForm.alertuser = false;
					oField.focus();
				}
			}
			break;

		case "sLpassword":
			bOk = (sValue.length >= nMinLenPassword && sValue.length <= nMaxLenPassword);
			if (!bOk) {
				if (oForm.alertuser) {
					FV_ShowMessage(SG_MsgLogEntPassLen);
					oForm.alertuser = false;
					oField.focus();
				}
				break;
			}
			bOk = ( SG_sInUserAllow == "" || FV_StripCharsNotInBag(sValue, SG_sInUserAllow) == sValue );
			if (!bOk) {
				if (oForm.alertuser) {
					FV_ShowMessage(SG_MsgLogEntPassChars + "\n" + SG_sInUserAllow);
					oForm.alertuser = false;
					oField.focus();
				}
			}
			break;
	}

	return bOk;
}

function SetupLoginFormOnLoad() {
	SetupLoginForm("login");
}
DomLoaded.load(SetupLoginFormOnLoad);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	logout confirm
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function LogoutConfirm() {
	return true;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Based of Clock 2.0, by Andrew Shearer
See: http://www.shearersoftware.com/software/web-tools/clock/
Redistribution is permitted with the above notice intact.

Client-side clock, based on computed time differential between browser &
server. The server time is inserted by server-side JavaScript, and local
time is subtracted from it by client-side JavaScript while the page is
loading.

Cookies: The local and remote times are saved in cookies named
localClock and remoteClock, so that when the page is loaded from local
cache (e.g. by the Back button) the clock will know that the embedded
server time is stale compared to the local time, since it already
matches its cookie. It can then base the calculations on both cookies,
without reloading the page from the server. (IE 4 & 5 for Windows didn't
respect Response.Expires = 0, so if cookies weren't used, the clock
would be wrong after going to another page then clicking Back. Netscape
& Mac IE were OK.)

Every so often (by default, one hour) the clock will reload the page, to
make sure the clock is in sync (as well as to update the rest of the
page content).
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var FS_oClock = null;
var localTime;
var clockOffset;
var clockExpirationLocal;
var clockTimerID = null;

//	use this is seconds are to be shown
var clockShowsSeconds = true;
var clockIncrementMillis = 1000;
//	use this if seconds are not shown
//var clockShowsSeconds = false;
//var clockIncrementMillis = 60000;

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
onload setup of objects
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FS_ClockSetup() {
	FS_oClock = document.getElementById("lb_clock");
	if (!FS_oClock || (Browser.isIE && Browser.isMac)) return;
	clockInit(clockLocalStartTime, clockServerStartTime);
}
DomLoaded.load(FS_ClockSetup);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
actual time update
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function FS_ClockUpdate(sTime) {
	FS_oClock.innerHTML = sTime;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function clockOnUnload() {
    clockClearTimeout();
}
window.onunload = clockOnUnload;

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function clockClearTimeout() {
    if (clockTimerID) {
        clearTimeout(clockTimerID);
        clockTimerID = null;
    }
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
on onload, initialize the clock properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function clockInit(localDateObject, serverDateObject)
{
    var origRemoteClock = parseInt(clockGetCookieData("remoteClock"));
    var origLocalClock = parseInt(clockGetCookieData("localClock"));
    var newRemoteClock = serverDateObject.getTime();
    // May be stale (WinIE); will check against cookie later
    // Can't use the millisec. ctor here because of client inconsistencies.
    var newLocalClock = localDateObject.getTime();
    var maxClockAge = 60 * 60 * 1000;   // get new time from server every 1hr

    if (newRemoteClock != origRemoteClock) {
        // new clocks are up-to-date (newer than any cookies)
        document.cookie = "remoteClock=" + newRemoteClock + ";secure";
        document.cookie = "localClock=" + newLocalClock+ ";secure";
        clockOffset = newRemoteClock - newLocalClock;
        clockExpirationLocal = newLocalClock + maxClockAge;
        localTime = newLocalClock;  // to keep clockUpdate() happy
    }
    else if (origLocalClock != origLocalClock) {
        // error; localClock cookie is invalid (parsed as NaN)
        clockOffset = null;
        clockExpirationLocal = null;
    }
    else {
        // fall back to clocks in cookies
        clockOffset = origRemoteClock - origLocalClock;
        clockExpirationLocal = origLocalClock + maxClockAge;
        localTime = origLocalClock;
        // so clockUpdate() will reload if newLocalClock
        // is earlier (clock was reset)
    }
    /* Reload page at server midnight to display the new date, by expiring the clock then */
    var nextDayLocal = (new Date(serverDateObject.getFullYear(), serverDateObject.getMonth(), serverDateObject.getDate() + 1)).getTime() - clockOffset;
    if (nextDayLocal < clockExpirationLocal) {
        clockExpirationLocal = nextDayLocal;
    }
	
	clockUpdate();
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
find the value of the specified cookie in the document's
    semicolon-delimited collection. For IE Win98 compatibility, search
    from the end of the string (to find most specific host/path) and
    don't require "=" between cookie name & empty cookie values. Returns
    null if cookie not found. One remaining problem: Under IE 5 [Win98],
    setting a cookie with no equals sign creates a cookie with no name,
    just data, which is indistinguishable from a cookie with that name
    but no data but can't be overwritten by any cookie with an equals sign.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function clockGetCookieData(label) {
    var c = document.cookie;
    if (c) {
        var labelLen = label.length, cEnd = c.length;
        while (cEnd > 0) {
            var cStart = c.lastIndexOf(';',cEnd-1) + 1;
            // bug fix to Danny Goodman's code: calculate cEnd, to prevent walking the string char-by-char & finding cookie labels that contained the desired label as suffixes
            // skip leading spaces
            while (cStart < cEnd && c.charAt(cStart)==" ") cStart++;
            if (cStart + labelLen <= cEnd && c.substr(cStart,labelLen) == label) {
                if (cStart + labelLen == cEnd) {
                    return ""; // empty cookie value, no "="
                }
                else if (c.charAt(cStart+labelLen) == "=") {
                    // has "=" after label
                    return unescape(c.substring(cStart + labelLen + 1,cEnd));
                }
            }
            cEnd = cStart - 1;  // skip semicolon
        }
    }
    return null;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function clockDisplayTime(tdDate, inHours, inMinutes, inSeconds) {
    FS_ClockUpdate(clockTimeString(tdDate, inHours, inMinutes, inSeconds));
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Called regularly to update the clock display as well as onLoad (user
	may have clicked the Back button to arrive here, so the clock would need
	an immediate update)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function clockUpdate()
{
    var lastLocalTime = localTime;
    localTime = (new Date()).getTime();

    /* Sanity-check the diff. in local time between successive calls;
       reload if user has reset system clock */
    if (clockOffset == null) {
        clockDisplayTime(null, null, null, null);
    }
    else if (localTime < lastLocalTime || clockExpirationLocal < localTime) {
        /* Clock expired, or time appeared to go backward (user reset the clock).
		Reset cookies to prevent infinite reload loop if server doesn't give a new time. */
        document.cookie = 'remoteClock=-;secure';
        document.cookie = 'localClock=-;secure';
        location.reload();      // will refresh time values in cookies
    }
    else {
        // Compute what time would be on server
        var serverTime = new Date(localTime + clockOffset);
        clockDisplayTime(toDateString(serverTime.getDate(), serverTime.getMonth(), serverTime.getFullYear()), serverTime.getHours(), serverTime.getMinutes(), serverTime.getSeconds());

        // Reschedule this func to run on next even clockIncrementMillis boundary
		var nIncr = clockIncrementMillis - (serverTime.getTime() % clockIncrementMillis);
        clockTimerID = setTimeout("clockUpdate()", nIncr);
    }
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function clockTimeString(tdDate, inHours, inMinutes, inSeconds) {
    return (tdDate + ", " + 
			(inHours < 10 ? "0" : "") + inHours
	        + ((inMinutes < 10) ? ":0" : ":") + inMinutes
    	    + (clockShowsSeconds ? ((inSeconds < 10 ? ":0" : ":") + inSeconds) : "")
		);
}

function toDateString(date, month, year) {
	var monthName = "";
	switch(month) {
		case 0:		monthName = "Jan"; break;
		case 1:		monthName = "Feb"; break;
		case 2:		monthName = "Mar"; break;
		case 3:		monthName = "Apr"; break;
		case 4:		monthName = "May"; break;
		case 5:		monthName = "Jun"; break;
		case 6:		monthName = "Jul"; break;
		case 7:		monthName = "Aug"; break;
		case 8:		monthName = "Sep"; break;
		case 9:		monthName = "Oct"; break;
		case 10:	monthName = "Nov"; break;
		case 11:	monthName = "Dec"; break;
	}

	return date + " " + monthName + " " + year;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Consts.js - replication of ASP Betslip constants, for JS engine
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2003, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Constants for BS selection array
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var BS_SID = 0;			//	selection ID
var BS_SNAME = 1;			//	selection name
var BS_PRC = 2;			//	selection price, in fractions format
var BS_UPRC = 3;			//	selection price, in user format
var BS_SPT = 4;			//	selection price type
var BS_CNUM = 5;			//	competitor number (races)
var BS_TRAP = 6;			//	is trap?
var BS_FAV = 7;			//	is favorite?
var BS_HCP = 8;			//	handicap value
var BS_HCPID = 9;			//	handicap ID
var BS_BANDID = 10;		//	band ID 4 selection
var BS_CURSCORE = 11;	//	current score for selection

var BS_MID = 12;			//	market ID
var BS_MNAME = 13;		//	market name
var BS_EID = 14;			//	event ID
var BS_ENAME = 15;		//	event name
var BS_MEID = 16;			//	meeting ID
var BS_MENAME = 17;		//	meeting name
var BS_RACE = 18;			//	is race?
var BS_APT = 19;			//	market active price types
var BS_IRT = 20;			//	old market inter-related tag
var BS_ABT = 21;			//	market active bet types
var BS_INR = 22;			//	is in-running?
var BS_ET = 23;			//	event start time
var BS_MTAG = 24;			//	IR Mtag
var BS_CTAG = 25;			//	IR Ctag
var BS_TTAGL = 26;		//	IR TtagLeft
var BS_TTAGR = 27;		//	IR TtagRight
var BS_MW = 28;			//	market max winners
var BS_ASIAN = 29;		//	is asian handicap?
var BS_EW = 30;			//	EW info: IDFOMarketEWTerms|EWreduction|EWPlaceTerms (when one) or IDFOMarketEWTerms|EWreduction|EWPlaceTerms#IDFOMarketEWTerms|EWreduction|EWPlaceTerms (when more)

var BS_EVSCID = 31;		//	IDFOEventScorecast
var BS_EVSCNAME = 32;	//	EventScorecast name

var BS_SCGSMID = 33;		//	scorecast:goal scorer market ID
var BS_SCGSSID = 34;		//	scorecast:goal scorer selection ID
var BS_SCGSSNAME = 35;	//	scorecast:goal scorer selection name
var BS_SCGSPRC = 36;		//	scorecast:goal scorer selection price, in fractions
var BS_SCGSMTAG = 37;
var BS_SCGSCTAG = 38;
var BS_SCGSTTAGL = 39;
var BS_SCGSTTAGR = 40;

var BS_SCCSMID = 41;
var BS_SCCSSID = 42;
var BS_SCCSSNAME = 43;
var BS_SCCSPRC = 44;		//	scorecast:correct score selection price, in fractions
var BS_SCCSMTAG = 45;
var BS_SCCSCTAG = 46;
var BS_SCCSTTAGL = 47;
var BS_SCCSTTAGR = 48;

//	extended stuff for slip operation
var BS_CHG = 49;		//	this will hold a value which identifies what has changed in particular selection since it//s added into slip [part of LU]

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Constants for BS IR checking array
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var BS_IRSCNT = 0;		//	sel. counter
var BS_IREID = 1;		//	event id
var BS_IRMW = 2;		//	max winners
var BS_IRMTAG = 3;		//	Mtag
var BS_IRCTAG = 4;		//	Ctag
var BS_IRTTAGL = 5;		//	TtagLeft
var BS_IRTTAGR = 6;		//	TtagRight
var BS_IRSELS = 7;		//	Selections
var BS_IRIS = 8;		//	Is inter-related?

var BS_IRPTR = 0;		//	pointer to colour-flag block element
var BS_IRCF = 1;		//	colour-flag code

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	BOPage.js - B/O Page betslip object constructor.
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2003, 2007, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var BS = null;
var BS_BOPageConstructor = function() {
	var self = this;
	var _bReady = false;

	/*
		PROPERTIES	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	*/
	this.sBOPageSelData = "SELid";				//	prefix for the name of the form element that keeps the selection-level data
	this.sBOPageSCSelData = "SCid";				//	prefix for the checkbox representing SC selection
	
	this.sTotalReturnFldName = "bstotalret";
	this.sTotalCostFldName = "bstotalcost";

	this.sSep = "~";
	this.sSlip = "BS_betslip";
	this.sSlipBodyID = "BS_body";
	this.sFormID = "BS_form";
	this.sSelFormField = "bssel";

	this.bSlipFull = false;		//	this is toggled from BS object
	this.sCurrency = "";
	this.nMinimumStake = 0;
	this.bIsTotalStakeTooLow = false;
	
	this.bUseSaveState = true;
	
	this.nMaxHeight = 500;
	this.bScroll = false;

	/*
		METHODS		- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	*/
	//	
	this.Init = function() {
		//	get form pointer
		var oForm = document.getElementById(self.sFormID);
		//	setup event handlers
		self.SetupBehavior();
		//	re-read user state
		self.RestoreUserState();
		//	setup layer slip
		var oSlip = document.getElementById(self.sSlip);
		if (oSlip) {
			//	should it scroll with users?
			if (self.bScroll) {
				xStick(oSlip);
				xStickScroll(oSlip);
			}
			//	set height after which scrollbar appears
			self.HeightThrashold();
		}
		// do client-specific stuff
		self.ClientInit();
		_bReady = true;
	};
	
	//	round and format the number, to always have decimals
	this.Round = function(nNum, nDecimals) {
		if (!nDecimals) nDecimals = nNumOfDecimals;
		return SG_GetNumWithDecimals(SG_Round(nNum, nDecimals), nDecimals);
	};

	//	this executes remote call
	this.oSrv = new AjaxConn();
	//	this is what will happen after each update
	if (this.oSrv)
		this.oSrv.Done = function() {
			//	if response is empty, do nothing
			var sResponse = this.responseText;
			if (sResponse == "") return;

			//	remote call will return entire new betslip content - simply dump it in
			var oSlipBody = document.getElementById(BS.sSlipBodyID);
			if (!oSlipBody) return;
			oSlipBody.innerHTML = sResponse;
			
			//	check: if ADD has failed, then class with CompositeID is added as classname to BS_form
			var oForm = document.getElementById(BS.sFormID);
			if (oForm) {
				var sCompositeID = oForm.className;
				if (sCompositeID != "") {
					if (sCompositeID.indexOf("_") != -1)
						sCompositeID = BS.sBOPageSCSelData + sCompositeID;
					else
						sCompositeID = BS.sBOPageSelData + sCompositeID;
					var oChk = document.getElementById(sCompositeID);
					if (oChk)
						oChk.checked = false;
				}
			}

			//	reenable all behaviors - calculations, links override etc.
			BS.SetupBehavior();

			//	re-read user state
			BS.RestoreUserState();

			//	hide the loader indicator
			BS.HideLoader();

			//	check if maximum height is reached
			BS.HeightThrashold();
			
			//after update client overides
			BS.AfterUpdate();
		};

	this.T = function(evt, oChk) {
		if (!_bReady) return;

		//	prevent the click to propagate up. *required* when additional code is added to fire this on row click [MER227]
		var e = (evt) ? evt : window.event;
		if (e.stopPropagation)
			e.stopPropagation();
		else
			e.cancelBubble = true;

		//	show the loader indicator
		self.ShowLoader();

		var sChkID = oChk.id;
		var sQS, sURL = "/finsoft/betslip/incasp/updateBS.asp";

		if (oChk.checked)
			sQS = "action=ADD";
		else
			sQS = "action=REM";

		if (sChkID.indexOf('SCid') == -1) {
			//	regular selection
			var nSelID = oChk.value;
			sQS += "&selid=" + escape(nSelID);
			self.oSrv.connect("POST", sURL, sQS);
		} else {
			//	scorecast selection
			var aID = oChk.value.split("|");
			sQS += "&scid=" + escape(aID[0]) + "&gsid=" + escape(aID[1]) + "&csid=" + escape(aID[2]);
			self.oSrv.connect("POST", sURL, sQS);
		}
	};

	//	mainly for outside use, simple refresh of the state. called on page load
	this.Refresh = function() {
		if (!_bReady) return;

		//	show the loader indicator
		self.ShowLoader();

		var sQS = "", sURL = "/finsoft/betslip/incasp/updateBS.asp";

		self.oSrv.connect("POST", sURL, sQS);
	};

	this.SetupBehavior = function() {
		//	BS_body exists only on layer slip, not on full page slip
		var oSlipBody = document.getElementById(self.sSlipBodyID);

		//	- - - - - ONLY ON LAYER SLIP - - - - -

		//	intercept remove clicks on the layer slip
		if (oSlipBody) xGetElementsByClassName("x", oSlipBody, "*", function(oTD) {
			var oA;
			if (oTD.nodeName.toLowerCase() == "a")
				oA = oTD;
			else
				oA = oTD.getElementsByTagName("a")[0];
			if (!oA) return;

			oA.onclick = function() {
				//	show the loader indicator
				BS.ShowLoader();

				//	clean URL
				var sURL = this.href.replace(/\&amp;/gi, '&');

				//	split URL and querystring
				var nPos = sURL.indexOf("?");
				sQS = sURL.substring(nPos+1);
				sURL = sURL.substring(0, nPos);

				//	remove sBackTo from QS. is sBackTo is found, the server page will redirect to /betslip/index.asp, which means the whole content from there will be placed inside the betslip. not good.
				//	thus, remove it from query string
				var nPos = sQS.toLowerCase().indexOf('sbackto');
				if (nPos != -1) {
					sQS = sQS.substring(0, nPos);
				}

				//	clear the checkbox on the B/O template
				var aTmp, sCompositeID, oChk;

				if (sQS.toUpperCase().indexOf("REMALL") != -1) {
					//	REMALL: remove all selections.
					//	process all selections in slip, extract selID (where 12.1 is already written as 121), locate the checkbox on the page and clear it
					oForm = document.getElementById(self.sFormID);
					if (!oForm) return;
					var oSels = oForm.elements[self.sSelFormField];
					if (!oSels) return;

					if (!oSels.length) {
						//	split to get sel ID
						aTmp = oSels.value.split(self.sSep);
						sCompositeID = aTmp[BS_SID];
						//	for scorecast join 3 IDs in correct order
						if (aTmp[BS_SPT] == "SC") {
							sCompositeID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
							oChk = document.getElementById(self.sBOPageSCSelData + sCompositeID);
						} else {
							oChk = document.getElementById(self.sBOPageSelData + sCompositeID);
						}
						//	if checkbox is found, untick it
						if (oChk)
							oChk.checked = false;
					} else {
						var nBound = oSels.length;
						for (var j=0;j<nBound;j++) {
							//	split to get sel ID
							aTmp = oSels[j].value.split(self.sSep);
							sCompositeID = aTmp[BS_SID];
							//	for scorecast join 3 IDs in correct order
							if (aTmp[BS_SPT] == "SC") {
								sCompositeID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
								oChk = document.getElementById(self.sBOPageSCSelData + sCompositeID);
							} else {
								oChk = document.getElementById(self.sBOPageSelData + sCompositeID);
							}
							//	if checkbox is found, untick it
							if (oChk)
								oChk.checked = false;
						}
					}

				} else {
					//	REM: remove particular selection.
					//	Sel. ID is already in the QS (in the 12.1 form), thus extract it from there, remove the decimal point, locate the checkbox on the page and clear it
					var aQS = this.search.substring(1).split("&");
					sCompositeID = "";
					var aCompositeID = new Array();
					for (var i=0;i<aQS.length;i++) {
						aTmp = aQS[i].split("=");
						//	for ordinary selection we need just sel.id
						if (aTmp[0].toLowerCase() == "selid") {
							sCompositeID = aTmp[1];
							break;
						//	for scorecast we need 3 IDs in correct order. thus we get them into an array, on correct positions
						} else if (aTmp[0].toLowerCase() == "scid") {
							aCompositeID[0] = aTmp[1];
						} else if (aTmp[0].toLowerCase() == "gsid") {
							aCompositeID[1] = aTmp[1];
						} else if (aTmp[0].toLowerCase() == "csid") {
							aCompositeID[2] = aTmp[1];
						}
					}
					//	for SC selection, join three IDs into one string
					if (aCompositeID.length == 3) {
						sCompositeID = aCompositeID.join("_");
						oChk = document.getElementById(self.sBOPageSCSelData + sCompositeID);
					} else {
						oChk = document.getElementById(self.sBOPageSelData + sCompositeID);
					}
					//	if checkbox is found, untick it
					if (oChk)
						oChk.checked = false;
				}

				//	contact server to get current slip content
				BS.oSrv.connect("POST", sURL, sQS);

				return false;
			};
		});

		//	setup change alerts
		if (oSlipBody) xGetElementsByClassName("chgalert", oSlipBody, "div", function(oElm) {
			if (!oElm) return;
			oElm.onmouseover = function() {
				this.parentNode.className += " alert";
			};
			oElm.onmouseout = function() {
				this.parentNode.className = this.parentNode.className.replace(/alert/gi, "");
			};
			oElm.onclick = function() {
				BS.RemoveAlert(this);
			}
		});
		
		//	refresh header
		if (oSlipBody)
			self.Header();

		//	- - - - - ON BOTH FULL PAGE & LAYER SLIP - - - - -

		//	slip form exists on both slips
		var oSlipForm = document.getElementById(self.sFormID);

		//	setup EW to...
		if (oSlipForm) xGetElementsByClassName("bsew", oSlipForm, "td", function(oTD) {
			var oEWfld = oTD.getElementsByTagName("input");
			if (oEWfld && oEWfld.length) {
				oEWfld = oEWfld[0];
				oEWfld.onclick = function() {
					//	...trigger calculations
					Calc.UpdateValues(this.form);
					//	...and to save stake values in cookie (along with other stuff)
					BS.SaveState(this.form);
				};
			} else {
				oEWfld = oTD.getElementsByTagName("select");
				if (oEWfld && oEWfld.length) {
					oEWfld = oEWfld[0];
					oEWfld.onchange = function() {
						//	...trigger calculations
						Calc.UpdateValues(this.form);
						//	...and to save stake values in cookie (along with other stuff)
						BS.SaveState(this.form);

						return false;
					};
				}
			}
		});

		//	setup stake update to...
		if (oSlipForm) xGetElementsByClassName("bsstake", oSlipForm, "td", function(oTD) {
			var oStake = oTD.getElementsByTagName("input")[0];
			if (!oStake) return;
			oStake.onkeyup = function() {
				//	...trigger calculations
				Calc.UpdateValues(this.form);
				//	...and to save stake values in cookie (along with other stuff)
				BS.SaveState(this.form);
			};
		});

		//	setup price(type) select to...
		if (oSlipForm) xGetElementsByClassName("bsptslc", oSlipForm, "select", function(oFld) {
			oFld.onchange = function() {
				//	...trigger PT update and calculations
				BS.UpdatePT(this, true);
				//	...and to save the current price type (along with other stuff)
				BS.SaveState(this.form);

				return false;
			};
		});
		
		//	setup checkboxes for saving user state
		if (oSlipForm) {
			var oFld;
			if (oFld = oSlipForm.elements["bsfree"]) oFld.onclick = function() {BS.SaveState(this.form);};
			if (oFld = oSlipForm.elements["bKeepSels"]) oFld.onclick = function() {BS.SaveState(this.form);};

			//	check prior to bet placement
			oSlipForm.onsubmit = function() {
				if (BS.bIsTotalStakeTooLow) {
					if (BS_MsgTotalStakeTooLow != "") alert(BS_MsgTotalStakeTooLow + " " + self.sCurrency + " " + self.nMinimumStake);
					return false;
				}
				return true;
			};
		}
	};

	//	called from iFrame, from betslipCalc.asp and betslipCalc4Multibets.asp
	this.SetCurrencyMinStake = function(sCurrency, nMinimumStake) {
		self.sCurrency = sCurrency;
		self.nMinimumStake = nMinimumStake;
	};

	//	updates the value on the form
	this.UpdateBetCost = function(aTotalCost, aTotalCost4Singles, bIsStakeTooLow) {
		var nAmount = 0;
		var bHasNA = false;
		var nTmp = 0;
		var sCompositeID, sBetType;
		var oHidden, oPublic;
		var oForm = document.getElementById(self.sFormID);
	
		_ClearAllBetCost(oForm);

		for (sCompositeID in aTotalCost4Singles) {
			nTmp = aTotalCost4Singles[sCompositeID];
			if (nTmp != "" && nTmp != null) {
				if (isNaN(nTmp)) {
					bHasNA = true;
				} else {
					nAmount += parseFloat(nTmp);
					nTmp = self.Round(nTmp);
				}
				oHidden = oForm.elements["bscost" + sCompositeID];
				if (oHidden)
					oHidden.value = nTmp;
				oPublic = document.getElementById("idbscost" + sCompositeID);
				if (oPublic)
					oPublic.innerHTML = nTmp;
			}
		}

		for (sBetType in aTotalCost) {
			nTmp = aTotalCost[sBetType];
			if (isNaN(nTmp)) {
				bHasNA = true;
			} else {
				nAmount += parseFloat(nTmp);
				nTmp = self.Round(nTmp);
			}
			oHidden = oForm.elements["bscost" + sBetType];
			if (oHidden)
				oHidden.value = nTmp;
			oPublic = document.getElementById("idbscost" + sBetType);
			if (oPublic)
				oPublic.innerHTML = nTmp;
		}
	
		if (bHasNA)
			nAmount = "N/A";
		else
			nAmount = self.Round(nAmount);
	
		oHidden = oForm.elements[self.sTotalCostFldName];
		if (oHidden)
			oHidden.value = nAmount;
		oPublic = document.getElementById("id" + self.sTotalCostFldName);
		if (oPublic)
			oPublic.innerHTML = nAmount;

		if (typeof(bIsStakeTooLow) != "undefined")
			self.bIsTotalStakeTooLow = bIsStakeTooLow;
	};

	//	clear the hidden fields and TDs containing single and multibets costs
	function _ClearAllBetCost(oForm) {
		xGetElementsByClassName("bscostS", oForm, "td", function(oTD) {
			oTD.innerHTML = "";
		});
		xGetElementsByClassName("bscostS", oForm, "input", function(oFld) {
			oFld.value = "";
		});
		xGetElementsByClassName("bscostM", oForm, "td", function(oTD) {
			oTD.innerHTML = "";
		});
		xGetElementsByClassName("bscostM", oForm, "input", function(oFld) {
			oFld.value = "";
		});
	}

	//	updates the value on the form
	this.UpdateBetReturn = function(aReturn, aReturn4Singles) {
		var nAmount = 0;
		var bHasNA = false;
		var nTmp = 0, aTmp;
		var sCompositeID, sBetType;
		var oHidden, oPublic;
		var oForm = document.getElementById(self.sFormID);
	
		_ClearAllBetReturn(oForm);

		for (sCompositeID in aReturn4Singles) {
			nTmp = aReturn4Singles[sCompositeID];
			if (nTmp != "" && nTmp != null) {
				if (isNaN(nTmp)) {
					bHasNA = true;
				} else {
					nAmount += parseFloat(nTmp);
					nTmp = self.Round(nTmp);
				}
				oHidden = oForm.elements["bsret" + sCompositeID];
				if (oHidden)
					oHidden.value = nTmp;
				oPublic = document.getElementById("idbsret" + sCompositeID);
				if (oPublic)
					oPublic.innerHTML = nTmp;
			}
		}

		for (sBetType in aReturn) {
			nTmp = aReturn[sBetType];
			if (isNaN(nTmp)) {
				bHasNA = true;
			} else {
				nAmount += parseFloat(nTmp);
				nTmp = self.Round(nTmp);
			}
			oHidden = oForm.elements["bsret" + sBetType];
			if (oHidden)
				oHidden.value = nTmp;
			oPublic = document.getElementById("idbsret" + sBetType);
			if (oPublic)
				oPublic.innerHTML = nTmp;
		}
	
		if (bHasNA)
			nAmount = "N/A";
		else
			nAmount = self.Round(nAmount);
	
		oHidden = oForm.elements[self.sTotalReturnFldName];
		if (oHidden)
			oHidden.value = nAmount;
		oPublic = document.getElementById("id" + self.sTotalReturnFldName);
		if (oPublic)
			oPublic.innerHTML = nAmount;
	};

	//	clear the hidden fields and TDs containing single and multibets returns
	function _ClearAllBetReturn(oForm) {
		xGetElementsByClassName("bsreturnS", oForm, "td", function(oTD) {
			oTD.innerHTML = "";
		});
		xGetElementsByClassName("bsreturnS", oForm, "input", function(oFld) {
			oFld.value = "";
		});
		xGetElementsByClassName("bsreturnM", oForm, "td", function(oTD) {
			oTD.innerHTML = "";
		});
		xGetElementsByClassName("bsreturnM", oForm, "input", function(oFld) {
			oFld.value = "";
		});
	}

	//	price type override by user
	this.UpdatePT = function(oSelPT, bDoCalc) {
		var sTmp = oSelPT.options[oSelPT.selectedIndex].value;
		var aTmp = sTmp.split("|");
		var sCompositeID = oSelPT.id.substring(4);	//	bsptID
		var oForm = oSelPT.form;

		var oSel = document.getElementById("bssel" + sCompositeID);
		if (!oSel) return;
		var _sSep = self.sSep;
		var aData = oSel.value.split(_sSep);
		
		aData[BS_SPT] = aTmp[0];
		aData[BS_PRC] = aTmp[1];
		aData[BS_UPRC] = aTmp[2];

		var sData = "";
		var nLen = aData.length;
		for (var i=0;i<nLen;i++) {
			sData += aData[i];
			if (i < aData.length-1)
				sData += _sSep;
		}
		oSel.value = sData;
		
		if (bDoCalc) Calc.UpdateValues(oForm);
	};

	//	display loader, position it over entire betslip body
	this.ShowLoader = function() {
		var oLoader = document.getElementById("loader");
		if (!oLoader) return;
		var oBS = document.getElementById(self.sSlipBodyID);
		xTop(oLoader, xTop(oBS));
		xWidth(oLoader, xWidth(oBS));
		xHeight(oLoader, xHeight(oBS));
		oLoader.style.visibility = "visible";
	};
	
	//	display loader, position it over entire betslip
	this.HideLoader = function() {
		var oLoader = document.getElementById("loader");
		if (!oLoader) return;
		oLoader.style.visibility = "hidden";
	};
	
	//	if maximum height is reached, display scrollbars
	this.HeightThrashold = function() {
		var oBS = document.getElementById(self.sSlipBodyID);
		if (!oBS) return;
		var oForm = document.getElementById(self.sFormID);
		if (xHeight(oForm) > self.nMaxHeight) {
			oBS.style.overflow = "auto";
			oBS.style.overflowX = "hidden";
			xHeight(oBS, self.nMaxHeight);
		} else {
			oBS.style.overflow = "visible";
			oBS.style.height = "auto";
		}
	};
	
	/*
		save entire user state: contents of drop-downs, stake boxes, checkboxes
			everything is saved in the cookie each time it's changed thus user values are always saved. each new save deletes anything that was there before
			reload will fetch the cookie and insert the values properly into form elements (Layout.asp will do this)
	*/
	this.SaveState = function(oForm) {
		if (!self.bUseSaveState) return;

		/*
			state-saver object has several members
			-	Stake[] is dictionary with key/value pairs like:
					Stake['bsstakeX'] = value
					where X is the selection ID (without the ".") or bettype ID. It is the value of "name" attribute for the particular stake input field
			-	Price[] is dictionary, but for price drop-downs
					Price['bsptX'] = oSelect.selectedIndex
			-	EW[] is dictionary, but for EW checkboxes
					EW['bsewX'] = true/false
			-	bFree keeps the state of the "Place using free balance" checkbox
					bFree = true/false
			-	bKeepSels keeps the state of the "Retain selections in slip after placement" checkbox
					bKeepSels = true/false
		*/
		var oState = { Stake: {}, Price: {}, EW: {}, bFree: false, bKeepSels: false };

		//	now go through form elements and populate the oState object
		var sSep = self.sSep;
		if (!oForm) oForm = document.getElementById(self.sFormID);
		var oSels = oForm.elements[self.sSelFormField];
		var oFld;
		oState.bFree = ((oFld = oForm.elements["bsfree"]) ? oFld.checked : false);
		oState.bKeepSels = ((oFld = oForm.elements["bKeepSels"]) ? oFld.checked : false);

		var sData = "", sID = "";
		if (oSels) {
			if (!oSels.length) {
				sData += oSels.value;
				//	split to get sel ID
				aTmp = oSels.value.split(sSep);
				sID = aTmp[BS_SID];
				//	if it's SC, then add more IDs: EVSCid_GSselid_CSselid
				if (aTmp[BS_SPT] == "SC") {
					sID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
				}
				oState = _DataFetch(oForm, sID, oState);
			} else {
				var nBound = oSels.length;
				for (var j=0;j<nBound;j++) {
					sData += oSels[j].value;
					//	split to get sel ID
					aTmp = oSels[j].value.split(sSep);
					sID = aTmp[BS_SID];
					//	if it's SC, then add more IDs: EVSCid_GSselid_CSselid
					if (aTmp[BS_SPT] == "SC") {
						sID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
					}
					oState = _DataFetch(oForm, sID, oState);
				}
			}
		}
		if (sData == "") return;

		//	fetch multiple bets
		var oBetTypes = oForm.elements["bettype"];
		if (oBetTypes) {
			if (!oBetTypes.length) {
				sID = oBetTypes.value;
				oState = _DataFetch(oForm, sID, oState);
			} else {
				var nBound = oBetTypes.length;
				for (var j=0;j<nBound;j++) {
					sID = oBetTypes[j].value;
					oState = _DataFetch(oForm, sID, oState);
				}
			}
		}

		//	ok, now transform into string using JSON and save into cookie
		setCookie("bsuserstate", JSON.stringify(oState));
	};
	
	//	helper function to avoid code repetition
	function _DataFetch(oForm, sID, oState) {
		var oField;
				//	get EW info
				oField = oForm.elements["bsew" + sID];
				if (oField) {
					if (oField.type == "checkbox") {
						oState.EW["bsew" + sID] = oField.checked;
					} else {
						//	multiple EW choices, save the selectedIndex
						oState.EW["bsew" + sID] = oField.selectedIndex;
					}
				}
				//	get stake
				oField = oForm.elements["bsstake" + sID];
				if (oField)
					oState.Stake["bsstake" + sID] = oField.value;
				//	get price type
				oField = oForm.elements["bspt" + sID];
				if (oField)
					oState.Price["bspt" + sID] = oField.selectedIndex;

		return oState;
	}

	//	restore all stake values, EW, prices - everything that user might have changed
	this.RestoreUserState = function() {
		if (!self.bUseSaveState) return;

		//	get the state from cookie
		var s = "";
		var oState = ((s=getCookie("bsuserstate")) != "") ? JSON.parse(s) : null;
		if (!oState) return;

		//	now go through form elements and populate the fields
		var oForm = document.getElementById(self.sFormID);
		if (!oForm) return;
		var oSels = oForm.elements[self.sSelFormField];
		var oFld;
		if (oFld = oForm.elements["bsfree"]) oFld.checked = oState.bFree;
		if (oFld = oForm.elements["bKeepSels"]) oFld.checked = oState.bKeepSels;

		//	restore stakes
		for (var i in oState.Stake) {
			//	saved stake for D will through error when 3rd selection is added and thus D is no longer offered as bet type
			if (!(oFld = oForm.elements[i])) continue;
			oFld.value = oState.Stake[i];
		}

		//	restore EWs
		for (var i in oState.EW) {
			//	saved EW for D will through error when 3rd selection is added and thus D is no longer offered as bet type
			if (!(oFld = oForm.elements[i])) continue;
			if (typeof(oState.EW[i]) == "boolean")	//	checkbox
				oFld.checked = oState.EW[i];
			else	//	drop-down
				oFld.selectedIndex = parseInt(oState.EW[i], 10);
		}

		//	restore prices
		for (var i in oState.Price) {
			//	saved price for D will through error when 3rd selection is added and thus D is no longer offered as bet type
			if (!(oFld = oForm.elements[i])) continue;
			oFld.selectedIndex = parseInt(oState.Price[i], 10);
			self.UpdatePT(oFld, false);
		}

		//	run calculations after state is restored
		Calc.UpdateValues(oForm);
	};

	//	called by LU
	this.GetSelectionIDCSV = function() {
		var sRet = "";
		var oForm = document.getElementById(self.sFormID);
		if (!oForm) return "";
		var oSels = oForm.elements[self.sSelFormField];
		if (!oSels) return "";

		if (!oSels.length) {
			//	split to get sel ID
			aTmp = oSels.value.split(self.sSep);
			sCompositeID = aTmp[BS_SID];
			//	for scorecast join 3 IDs in correct order.
/*
			if (0 && aTmp[BS_SPT] == "SC")
				sCompositeID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
*/
			sRet += "," + sCompositeID;
		} else {
			var nBound = oSels.length;
			for (var j=0;j<nBound;j++) {
				//	split to get sel ID
				aTmp = oSels[j].value.split(self.sSep);
				sCompositeID = aTmp[BS_SID];
				//	for scorecast join 3 IDs in correct order
/*
				if (0 && aTmp[BS_SPT] == "SC")
					sCompositeID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
*/
				sRet += "," + sCompositeID;
			}
		}
		if (sRet.length != 0)
			sRet = sRet.substring(1);
			
		return sRet;
	};
	
	//	called by LU
	this.ReRead = function(sSelCSV) {
		if (!_bReady) return;

		//	show the loader indicator
		self.ShowLoader();

		var sURL = "/finsoft/betslip/incasp/updateBS.asp";
		var sQS = "action=REREAD&selIDCSV=" + escape(sSelCSV);
		self.oSrv.connect("POST", sURL, sQS);
	};

	//	called when clicking on change alert icon, to remove it
	this.RemoveAlert = function(oAlert) {
		if (!_bReady) return;
		
		var sID = oAlert.id, nSelID, nSCID, nGSID, nCSID, aTmp;
		if (sID == "") return;

		if (sID.indexOf("_") == -1) {
			nSelID = sID;
			nSCID = 0;
			nGSID = 0;
			nCSID = 0;
		} else {
			nSelID = 0;
			aTmp = sID.split("_");
			nSCID = aTmp[0];
			nGSID = aTmp[1];
			nCSID = aTmp[2];
		}
		
		//	silently update server
		var sURL = "/finsoft/betslip/incasp/updateBS.asp";
		var sQS = "action=REMCHG&nor=1";	//	nor=1 means that it will return empty response.
		sQS += "&selID=" + escape(nSelID) + "&SCid=" + escape(nSCID) + "&GSid=" + escape(nGSID) + "&CSid=" + escape(nCSID);
		self.oSrv.connect("POST", sURL, sQS);

		//	remove the icon and the message
		var aChilds = oAlert.parentNode.getElementsByTagName("div");
		for (var i=0;i<aChilds.length;i)
			aChilds[i].parentNode.removeChild(aChilds[i]);
	};

	//	extendability for specific client needs
	//	1. toggle slip on/off
	this.ShowHide = function() {return true;};
	//	2. change header
	this.Header = function() {return true;};
	//	3. init
	this.ClientInit = function() {};
	// 4. after update
	this.AfterUpdate =function() {};

	return this;
};
BS = new BS_BOPageConstructor();
DomLoaded.load(BS.Init);


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Calc.js - Betslip calculator handler
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2003, 2007, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var Calc = null;
var Calc_Constructor = function() {
	var self = this;
	
	this.UpdateValues = function(oForm) {
		self.Calc(oForm);
		return false;
	};

	this.Calc = function(oForm) {
		var sSep = BS.sSep;
		if (!oForm) oForm = document.getElementById(BS.sFormID);
		var oSels = oForm.elements[BS.sSelFormField];
		var oFld, bIsFree = ((oFld = oForm.elements["bsfree"]) ? oFld.checked : false);

		var sData = "", sID = "";
		var sSEW = "", aTmp;
		var sSStakes = "";
		if (oSels) {
			if (!oSels.length) {
				sData += oSels.value;
				//	split to get sel ID
				aTmp = oSels.value.split(sSep);
				sID = aTmp[BS_SID];
				//	if it's SC, then add more IDs: EVSCid_GsID_CsID
				if (aTmp[BS_SPT] == "SC") {
					sID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
				}

				aTmp = _DataFetch(oForm, sID, sSEW, sSStakes, false);
				sSEW = aTmp[0];
				sSStakes = aTmp[1];
			} else {
				var nBound = oSels.length;
				for (var j=0;j<nBound;j++) {
					sData += oSels[j].value;
					//	split to get sel ID
					aTmp = oSels[j].value.split(sSep);
					sID = aTmp[BS_SID];
					//	if it's SC, then add more IDs: EVSCid_GsID_CsID
					if (aTmp[BS_SPT] == "SC") {
						sID = aTmp[BS_EVSCID] + "_" + aTmp[BS_SCGSSID] + "_" + aTmp[BS_SCCSSID];
					}

					aTmp = _DataFetch(oForm, sID, sSEW, sSStakes, false);
					sSEW = aTmp[0];
					sSStakes = aTmp[1];

					//	add separator
					if (j<nBound-1) {
						sData += ":::";
						sSEW += ":::";
						sSStakes += ":::";
					}
				}
			}
		}
		if (sData == "") return;

		//	fetch multiple bets
		var sMEW = "";
		var sMStakes = "";
		var sMBetTypes = "";
		var sSEW4MEW = "";

		var oBetTypes = oForm.elements["bettype"];
		if (oBetTypes) {
			if (!oBetTypes.length) {
				sID = oBetTypes.value;
				sMBetTypes += sID;

				aTmp = _DataFetch(oForm, sID, sMEW, sMStakes, true);
				sMEW = aTmp[0];
				sMStakes = aTmp[1];
			} else {
				var nBound = oBetTypes.length;
				for (var j=0;j<nBound;j++) {
					sID = oBetTypes[j].value;
					sMBetTypes += sID;

					aTmp = _DataFetch(oForm, sID, sMEW, sMStakes, true);
					sMEW = aTmp[0];
					sMStakes = aTmp[1];
	
					//	add separator
					if (j<nBound-1) {
						sMBetTypes += ":::";
						sMEW += ":::";
						sMStakes += ":::";
					}
				}
			}
			sSEW4MEW = _AllSEWFetch(oForm);
			if (sSEW4MEW != "") sSEW4MEW = sSEW4MEW.substring(3);
		}

		if (sMStakes == "" && sSStakes == "")
			return;

		var sAction = "/finsoft/betslip/incasp/betslipCalc4MultiBets.asp";
		var sURL = sAction + "?sstakes=" + escape(sSStakes) + "&sEW=" + escape(sSEW) + "&free=" + bIsFree + "&sels=" + escape(sData) + "&mEW=" + escape(sMEW) + "&mstakes=" + escape(sMStakes) + "&mbettypes=" + escape(sMBetTypes) + "&sSEW4MEW=" + escape(sSEW4MEW);
		BS_oCalcFrame.Load( sURL );
	};

	//	helper function to avoid code repetition
	function _DataFetch(oForm, sID, sEW, sStakes, bIsMultipleBets) {
		var oField, sEWcollector;
				//	get EW info
				oField = oForm.elements["bsew" + sID];
				if (oField) {
					if (oField.type == "checkbox") {
						if (bIsMultipleBets)
							sEW += oField.checked;
						else if (oField.checked)
							sEW += oField.value.split("|")[1];		// IDFOMartketEWTerms|EWreduction|EWplaceTerms
					} else {
						//	multiple EW choices, get the selected one and split it to get EW term
						sEWcollector = oField.options[oField.selectedIndex].value;
						if (sEWcollector != "")
							sEW += sEWcollector.split("|")[1];		// IDFOMartketEWTerms|EWreduction|EWplaceTerms
					}
				} else if (bIsMultipleBets)
					sEW += "false";
				else
					sEW += "";

				//	get stake
				oField = oForm.elements["bsstake" + sID];
				if (oField)
					sStakes += oField.value;

		return [sEW,sStakes];
	}

	//	get EWs for all selections
	function _AllSEWFetch(oForm) {
		var oField, sEWcollector;
		var sEW = "";
		var sID, aSels = oForm.elements[BS.sSelFormField];
		for (var i=0;i<aSels.length;i++) {
			sID = aSels[i].id.substring(5);
				//	get EW info
				sEW += ":::";
				oField = oForm.elements["bsew" + sID];
				if (oField) {
					if (oField.type == "checkbox") {
						sEW += oField.value.split("|")[1];		// IDFOMartketEWTerms|EWreduction|EWplaceTerms
					} else {
						//	multiple EW choices, get the selected one and split it to get EW term
						sEWcollector = oField.options[oField.selectedIndex].value;
						if (sEWcollector != "")
							sEW += sEWcollector.split("|")[1];		// IDFOMartketEWTerms|EWreduction|EWplaceTerms
					}
				}
		}
		return sEW;
	}

	return this;
};
Calc = new Calc_Constructor();




/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Betslip.js - extender for /finsoft/betslip/script/BOPage.js
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	(c) Copyright 2007, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
if (BS) {
	BS.ClientInit = function() {
		var oHeader = document.getElementById("BS_header");
		if (!oHeader) return;
		//	setup header clickability
		oHeader.onclick = function() {
			if (BS)
				BS.ShowHide(this);
			this.blur();
		};
		//	update selnum
		BS.Header();
		
		var oClose = document.getElementById("BS_close");
		if (!oClose) return;
		oClose.onclick = function() {
			if (!BS) return;
			var oHeader = document.getElementById("BS_header");
			BS.ShowHide(oHeader);
			this.blur();
		};

		return true;
	};

	BS.ShowHide = function(oHeader) {
		if (!oHeader) oHeader = document.getElementById("BS_header");
		var oBS = oHeader.parentNode;
		if (oBS.className.indexOf("bshide") != -1) {
			//	show BS body
			oBS.className = oBS.className.replace(/bshide/gi, "bsshow");
			if (typeof(WCH) != "undefined" && WCH) WCH.Apply(oBS, document.getElementById("cmain"), true);
			BS.HeightThrashold();
		} else {
			//	hide BS body
			oBS.className = oBS.className.replace(/bsshow/gi, "bshide");
			if (typeof(WCH) != "undefined" && WCH) WCH.Discard(oBS, document.getElementById("cmain"));
		}
	};

	BS.Header = function() {
		var oSelNum = document.getElementById("BS_sn");
		if (!oSelNum) return;
		//	get number of sels
		var nSelCount = 0;
		var oForm = document.getElementById(BS.sFormID);
		if (oForm) {
			var aSels = oForm.elements[BS.sSelFormField];
			if (aSels)
				nSelCount = ((typeof(aSels.length) == "undefined") ? 1 : aSels.length);
		}
		//	update 
		oSelNum.innerHTML = nSelCount;
		//	how many selections?
		var oBS = oSelNum.parentNode.parentNode;
		if (nSelCount == 0) {
			oBS.className = oBS.className.replace(/bscon/gi, "");
			oBS.className += " bscoff";
		} else {
			oBS.className = oBS.className.replace(/bscoff/gi, "");
			oBS.className += " bscon";
		}
	};
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	BetNavigation.js - v2.1 - Library of functions for setting/passing BetNav information on/between pages
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Copyright (c) 2003, 2007, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

//	hide Add2Slip button on B/O pages
document.write('<style type="text/css" media="all">.bosubmit{display:none !important;}</style>');
//	hide Go! button in betting navigation
document.write( '<style "type="text/css" media="all">#BNGo{display:none !important}</style>' );
//	hide Go! button in scorecast template
document.write( '<style "type="text/css" media="all">#SCFGSGo{display:none !important}</style>' );
//	hide all coupon except 1st one
document.write( '<style "type="text/css" media="screen">.collapsed{display:none}</style>' );

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	dummy functions. overridden in other files
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_Suspend() {}
function BN_Unsuspend() {}
function BN_SuspendList() {}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_Go( oSl ) {
	var oForm = oSl.form;
	var x = oForm.elements["sl"];
	if (x) x.value = oSl.name;
	oForm.submit();
}
function BN_MTCGo( oSl ) {
	var oForm = oSl.form;
	if (oSl && oSl.options[oSl.selectedIndex].value != "")
		oForm.submit();
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_SCChange(oSl, nIndex, sQS) {
	var oForm = document.forms["bonavfrm"];
	var sAct;
	sAct = "/betting/index.asp";
	
	if (sQS != "") sAct += sQS + "&";
	else sAct += "?";
	
	sAct += "FGS" + nIndex + "=" + oSl.options[oSl.selectedIndex].value + "#scorecast" + nIndex;

	if (location.replace)
		location.replace(sAct);
	else
		location.href = sAct;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	collapse/expand child coupon
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_ExpCol(sID, bForceCollapse) {
	if (!document.getElementById) return;

	var x = document.getElementById(sID);
	if (!x) return;

	//	suspended B/O
	var aSusp = xGetElementsByClassName("BOsusp", x);

	if (xDef(bForceCollapse))
		bCollapse = bForceCollapse;
	else
		bCollapse = xIsOn(x);

	if ( bCollapse ) {
		xOff(x);
		for (var i=0;i<aSusp.length;i++)
			xOff(document.getElementById("Susp" + aSusp[i].id));
	} else {
		xOn(x);
		for (var i=0;i<aSusp.length;i++)
			xOn(document.getElementById("Susp" + aSusp[i].id));
	}

	aAllSusp = xGetElementsByClassName("susp", document, "div");
	for (var i=0;i<aAllSusp.length;i++)
		BN_SuspRepos(aAllSusp[i]);
}

//	collapse/expand ALL child coupons
function BN_ExpandAllCoupons(oBtn) {
	if (!document.getElementById) return;

	aCoup = xGetElementsByClassName("expcolact", document, "div");
	
	oBtn.collapsed = !oBtn.collapsed;

	if ( aCoup.length > 0 ) {
		for ( var i=0;i<aCoup.length;i++ )
			BN_ExpCol(aCoup[i].id, oBtn.collapsed);

		//	update the caption on the button
		if ( oBtn.collapsed )
			oBtn.innerHTML = FS_I18N("Expand all");
		else
			oBtn.innerHTML = FS_I18N("Collapse all");
	}
}

//	setup clickability for all coupons
function BN_CollapsedSetup() {
	xGetElementsByClassName("expcol", document, "h5", function(oAct) {
		//	find the DIV, right next to this H5
		var oDiv = oAct.nextSibling;
		while (oDiv && oDiv.nodeName.toLowerCase() != "div") {
			oDiv = oDiv.nextSibling;
		}
		//	save the ID for the DIV that should be closed
		oAct.expcolid = oDiv.id;
		//	setup clickability
		oAct.onclick = function() {
			BN_ExpCol(this.expcolid);
		};
	});
}
DomLoaded.load(BN_CollapsedSetup);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_TabsSetup() {
	xGetElementsByClassName("botabs", document, "ul", function(oUL) {
		BN_TabHideAll(oUL, true);
		var aA = oUL.getElementsByTagName("a");
		for (var i=0;i<aA.length;i++) {
			aA[i].onclick = function() {
				var sTabID = this.href.substring(this.href.lastIndexOf("#")+1);
				var oTbl = document.getElementById(sTabID);
				if (oTbl) {
					BN_TabHideAll(this.parentNode.parentNode, false);
					oTbl.style.display = "table";
					this.parentNode.className += " cur";
				}
				this.blur();
				return false;
			};
		}
	});
}
DomLoaded.load(BN_TabsSetup);

function BN_TabHideAll(oUL, bShowFirst) {
	var oTbl, sTabID, aA = oUL.getElementsByTagName("a");
	for (var i=0;i<aA.length;i++) {
		sTabID = aA[i].href.substring(aA[i].href.lastIndexOf("#")+1);
		if ((oTbl = document.getElementById(sTabID)) && (!bShowFirst || (bShowFirst && i>0)) ) {
			aA[i].parentNode.className = aA[i].parentNode.className.replace(/cur/gi, "");
			oTbl.style.display = "none";
		} else if (oTbl && bShowFirst) {
			aA[i].parentNode.className += " cur";
		}
	}
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Suspended.js - v2.0 - Mark markets as suspended
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Copyright (c) 2003, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	dynamically create a "suspended" cover for passed ID
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_SuspLayer(sID) {
	//	create hiding iFrame object
	var sTemplateID = "Susp" + sID;
	var oDiv = document.getElementById(sTemplateID);
	if (!oDiv) {
		var sTemplateHolderID = "th" + sID.substring(1);
		var oCont = document.getElementById(sTemplateHolderID);

		var oBO = document.getElementById(sID);
		if (!oBO) return null;
		if ( oBO.className.indexOf("BOsusp") == -1 )
			oBO.className += " BOsusp";

		if (oCont) {
			var nLeft = xLeft(oBO);
			var nTop = xTop(oBO);
		} else {//	this market is in the coupon. find the parent to insert it
			oCont = oBO;
			var nLeft = 0;
			var nTop = 0;
			while (oCont) {
				if (oCont.className.indexOf("cpntemplateholder") != -1 ) break;
				nLeft += oCont.offsetLeft;
				nTop += oCont.offsetTop;
				if (oCont.offsetParent) oCont = oCont.offsetParent;
				else break;
			}
		}
		if (oCont) {
			var sDivHTML = '<div id="' + sTemplateID + '" class="susp"><p>' + FS_I18N("Suspended") + '</p></div>';
			if (typeof(oCont.insertAdjacentHTML) != "undefined")
				oCont.insertAdjacentHTML("afterBegin", sDivHTML);
			else {
				var r = oCont.ownerDocument.createRange();
				r.setStartBefore(oCont);
				oCont.insertBefore(r.createContextualFragment(sDivHTML), oCont.firstChild);
			}
			oDiv = document.getElementById(sTemplateID);
			var nWidth = xWidth(oBO);
			var nHeight = xHeight(oBO);
			xWidth(oDiv, nWidth);
			xHeight(oDiv, nHeight);
			xLeft(oDiv, nLeft);
			xTop(oDiv, nTop);
		}
	}
	return oDiv;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	move cover over the template
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_Suspend(sID) {
	
	if (sID.substring(0,1) != 't') sID = 't' + sID;
	
	var oLayer = BN_SuspLayer(sID);
	if (oLayer)
		xShow(oLayer);
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	move cover away from template
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_Unsuspend(sID) {
	
	if (sID.substring(0,1) != 't') sID = 't' + sID;
	
	var sTemplateID = "Susp" + sID;
	var oLayer = document.getElementById(sTemplateID);
	if (oLayer)
		xHide(oLayer);

	var oBO = document.getElementById(sID);
	oBO.className.replace(" BOsusp", "");
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	reposition layer when child coupon template is collapsed
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_SuspRepos(oLayer) {
	if (typeof(oLayer) == "object") {
		if ( !xIsOn(oLayer) ) return;

		var sID = oLayer.id.substring(4);
		oCont = document.getElementById(sID);
		var nTop = 0;

		while (oCont) {
			if (oCont.className.indexOf("cpntemplateholder") != -1 ) break;
			nTop += oCont.offsetTop;
			if (xDef(oCont.offsetParent)) oCont = oCont.offsetParent;
			else break;
		}

		if (oCont) {
			xTop(oLayer, nTop);
		}
	}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	global function that calls suspending onload
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function BN_SuspendList() {
	var aTmp = xGetElementsByClassName("BOsusp", document, "tr");
	for (var i=0;i<aTmp.length;i++) {
		BN_Suspend(aTmp[i].id);
	}
	aTmp = xGetElementsByClassName("BOsusp", document, "table");
	for (var i=0;i<aTmp.length;i++) {
		BN_Suspend(aTmp[i].id);
	}
	aTmp = xGetElementsByClassName("BOsusp", document, "div");
	for (var i=0;i<aTmp.length;i++) {
		BN_Suspend(aTmp[i].id);
	}
}
DomLoaded.load(BN_SuspendList);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	MoreBets.js - v3.0 - More Bets layer show/hide
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Copyright (c) 2003, 2007, Finsoft Ltd

	dependency:
	* FAL/client/BrowserDetectLite.js
	* FAL/client/x.js
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
var MB = null;
var MB_Constructor = function() {
	var self = this;
	
	var _bIsIE = Browser.isIE;
	
	this.Init = function() {
		//	find all DIV elements with class "mb"
		xGetElementsByClassName("mb", document, "div", function(oDiv) {
			//	for each setup mouse events
			
			//	this is the kind of events we need. at the moment (sep'07) only IE has them
			if (typeof(oDiv.onmouseenter) != "undefined" && typeof(oDiv.onmouseleave) != "undefined") {
				oDiv.onmouseenter = function() {
					this.className += " mbshown";
					//	for IE, set this class to all parent elements that has position:relative or position:absolute
					if (_bIsIE)
						MB._setParents(this, true);
					// add style overflow:scroll if height is bigger than Viewport
					var oMenu = MB._getMenu(this);
					if(xHeight(oMenu) >= Viewport.Height){
						oMenu.style.height = Viewport.Height + "px";
						oMenu.style.overflow = "auto";
					}	
					//	reposition as needed
					MB._reposition(this);
					//	get the actual menu pointer
					var oMenu = MB._getMenu(this);
					//	hide wind. controls
					if (typeof(WCH) != "undefined" && WCH) WCH.Apply(oMenu, this, true);
				};
				
				oDiv.onmouseleave = function() {
					this.className = this.className.replace(/mbshown/gi, "");
					//	for IE, set this class to all parent elements that has position:relative or position:absolute
					if (_bIsIE)
						MB._setParents(this, false);
					//	hide wind. controls
					var oMenu = MB._getMenu(this);
					if (typeof(WCH) != "undefined" && WCH) WCH.Discard(oMenu, this);
				};

			} else {	//	...simulate for others
				oDiv.onmouseover = function(e) {
					if (!MB._shouldFire(e, true)) return;
					// add style overflow:scroll if height is bigger than Viewport
					var oMenu = MB._getMenu(this);
					if(xHeight(oMenu) >= Viewport.Height){
						oMenu.style.height = Viewport.Height + "px";
						oMenu.style.overflow = "auto";
					}
					//	reposition as needed
					MB._reposition(this);
					//	show
					this.className += " mbshown";
					
				};
				
				oDiv.onmouseout = function(e) {
					if (!MB._shouldFire(e, false)) return;
					//	hide
					this.className = this.className.replace(/mbshown/gi, "");
				};
			}
		});
	};

	//	get the pointer to the menu
	this._getMenu = function(oElm) {
		//	get the actual menu pointer
		var oMenu = oElm.getElementsByTagName("ul");
		if (!oMenu || !oMenu[0]) return null;
		return oMenu[0];
	};

	//	helper function for simulation of mouseenter/mouseleave
	this._shouldFire = function(e, bIsOver) {
		//	get the element that fired the event (_TO_ which mouse has moved)
		var oTarget = e.target;
		//	get the element _FROM_ which the mouse moved
		var oRelTarget = e.relatedTarget;
		//	starting from rel. target, move up until you encounter either body or _TO_
		while (oRelTarget && oRelTarget != oTarget && oRelTarget.nodeName != 'BODY') {
			oRelTarget = oRelTarget.parentNode;
		}
		//	if we have found _TO_, then this is actually internal movement, inside the MB div, thus do not fire mouse event again
		if (oTarget === oRelTarget)
			return ((bIsOver) ? true : false);
		
		return true;
	};

	//	helper function for IE, for setting/removing "mbup" class to all parent elements that have CSS property position set (needed to resolve IE's z-index bug)
	this._setParents = function(oElm, bSet) {
		var oParent = oElm;
		while (oParent.nodeName != 'BODY') {
			if (oParent.currentStyle.position == "relative" || oParent.currentStyle.position == "absolute")
				(bSet) ? oParent.className += " mbup" : oParent.className = oParent.className.replace(/mbup/gi, "");
			oParent = oParent.parentNode;
		}
	};

	//	if the menu falls outside the visible viewport, try to bring into view
	this._reposition = function(oElm, oMenu) {
		if (!oMenu) oMenu = MB._getMenu(oElm);
		//	get layer dims
		var nW = xWidth(oMenu);
		var nH = xHeight(oMenu);
		//	get page coordinates of its top-left corner
		var nPageX = xPageX(oMenu);
		var nPageY = xPageY(oMenu);
		//	get available client dims
		var nClientW = xClientWidth();
		var nClientH = xClientHeight();
		//	if we know client browser dims, re-position layer if needed
		if ( nClientH != 0) {
			var nDiffY = nClientH + xScrollTop() - (nPageY + nH);
			if (nDiffY < 0)
				xTop(oMenu, nDiffY);
		}
	};
	
	return this;
};
var MB = new MB_Constructor();
DomLoaded.load(MB.Init);
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	RaceBets.js - v3.0 - Functionality for F'cast / T'cast and similar templates
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Copyright (c) 2003, 2007, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

function RP_Toggle(oHeader) {
	var oDiv = oHeader.parentNode;
	if (oDiv.className.indexOf("fctcoff") == -1) {
		//	hide it
		oDiv.className += " fctcoff";
	} else {
		//	show it
		oDiv.className = oDiv.className.replace("fctcoff", "");
	}
}

var RP = null;

function RP_Click(oChk, i) { if (RP && RP.Click) RP.Click(oChk, i); }
function RP_Calc(sType) { if (RP && RP.Calc) RP.Calc(sType); }
function RP_Submit(oBtn) { if (RP && RP.Submit) RP.Submit(oBtn); }

var RP_Constructor = function() {
	var self = this;

	this.sCurrency = "";
	this.nMinimumStake = 0;
	this.bIsTotalStakeTooLow = false;

	this.Init = function() {};

	//	when user clicks on the Fc/Tc template
	this.Click = function(oChk, nIndex) {
		//	extract CHK details
		var sType = oChk.id.substring(0,2);
		var nOrder = parseInt(oChk.id.substring(2,3), 10);
		var sMarketID = oChk.id.substring(7);
//		alert(sType + "|" + nOrder + "|" + sSelID);
		var i, oTmp, nMaxChkOrder = ((sType=="FC" || sType=="EX" || sType=="QU") ? 2 : 3);
		//	do clearing
		if (nOrder == 0) {
			_ClearStraight(oChk.form, sType, nMaxChkOrder, sMarketID);
		} else {
			_ClearAny(oChk.form, sType, sMarketID);
		}
		//	recalculate everything
		self.Calc(sType);
	};

	//	total cost calculation. sType is FC, TC, EX, TF, QU
	this.Calc = function(sType) {
		var oStake = document.getElementById("rpstake" + sType);
		if (!oStake) return;
		var oCost = document.getElementById("idrpcost" + sType);
		var oCostHidden = document.getElementById("rpcost" + sType);
		if (!oCost || !oCostHidden) return;
		var sMarketSuffix = "";
		switch(sType) {
			case "FC": case "TC":
				sMarketSuffix = "fctc"; break;
			case "EX": case "TF":
				sMarketSuffix = "extf"; break;
			case "QU":
				sMarketSuffix = "qu"; break;
		}
		var oMarketID = document.getElementById("rpmk" + sMarketSuffix);
		if (!oMarketID) return;

		//	clear previous cost values
		oCost.innerHTML = "";
		oCostHidden.value = "";

		//	process stake value
		var sStake = FV_Trim(oStake.value);
		//	check if stake is numeric
		if ( !(FV_IsFloat(sStake) || FV_IsInteger(sStake)) ) {
//			alert(SG_MsgBetNavEntStake);
			oStake.value = "";
			oStake.focus();
		}
		var nStake = parseFloat(sStake);
		
		//	get marketID
		var sMarketID = oMarketID.value;

		//	get stake multiplier (number of bets)
		var nBetsCount = _BetsCount(oStake.form, sType, sMarketID);
		//	0 means invalid bet setup
		if (nBetsCount == 0) return;

		//	calculate total stake
		var nCost = nBetsCount * nStake;
		//	round the number to 2 decimals and show it
		if (nCost > 0) {
			oCostHidden.value = SG_GetNumWithDecimals(nCost, 2);
			oCost.innerHTML = oCostHidden.value;
		}

		if (nCost < parseFloat(self.nMinimumStake))
			self.bIsTotalStakeTooLow = true;
		else
			self.bIsTotalStakeTooLow = false;
	};

	//	these template can be used as shortcut to multiple F'cast and similar; carefully calculate all different combinations
	function _BetsCount(oForm, sType, sMarketID) {
		var nMaxChkOrder = ((sType=="FC" || sType=="EX" || sType=="QU") ? 2 : 3);
		
		var oBetType = document.getElementById("rpbettype" + sType);

		//	get indexes of ticked checkboxes in any column
		var nBetsCount = _GetNumberOfAny(oForm, sType, sMarketID);
		//	if nothing is checked, then look for straight order bets
		if (nBetsCount == 0) {
			var aStraightColumns = _GetNumberOfChecked(oForm, sType, sMarketID);
			//	check if all parts of the bet are properly populated
			var nBetsCount = _StraightBetsCount(aStraightColumns, oForm, sType, nMaxChkOrder);
			if (nBetsCount == 0) return 0;
			//	write the bet type ID in hidden field
			if (oBetType)
				if (nMaxChkOrder == 2) {
					//	SFC, EX
					switch (sType) {
						case "FC": oBetType.value = "SFC"; break;
						case "EX": oBetType.value = "EX"; break;
					}
				} else {
					//	STC, STF
					switch (sType) {
						case "TC": oBetType.value = "STC"; break;
						case "TF": oBetType.value = "STF"; break;
					}
				}
		} else if (nMaxChkOrder == 2) {
			if (nBetsCount < 2) return 0;
			if (nBetsCount == 2) {
				if (sType == "QU") {
					if (oBetType) oBetType.value = "QU";
					return 1;
				} else if (oBetType)
				//	else RFC or REX bets. number of bets is 2
						switch (sType) {
							case "FC": oBetType.value = "RFC"; break;
							case "EX": oBetType.value = "REX"; break;
						}
			}
			if (nBetsCount > 2 )	{	//	CFC, CEX => n(n-1)
				nBetsCount = nBetsCount * (nBetsCount-1);
				if (oBetType)
					switch (sType) {
						case "FC": oBetType.value = "CFC"; break;
						case "EX": oBetType.value = "CEX"; break;
					}
			}
		} else {
			if (nBetsCount < 3) return 0;
			if (sType == "QU") {	//	this is CQU bet =>	n!/(k!*(n-k)!)
				if (oBetType) oBetType.value = "CQU";
				nBetsCount = _Factorial(nBetsCount) / ( 2 * _Factorial(nBetsCount-2) );
			} else {	//	CTC, CTF =>	n(n-1)(n-2)
				if (oBetType)
					switch (sType) {
						case "TC": oBetType.value = "CTC"; break;
						case "TF": oBetType.value = "CTF"; break;
					}
				nBetsCount = nBetsCount * (nBetsCount-1) * (nBetsCount-2);
			}
		}
		return nBetsCount;
	}

	//	returns array of values from ticked checkboxes in each column
	//	aRet[0][0] = 1st column, 1st ticked checkbox value
	function _GetNumberOfChecked(oForm, sType, sMarketID) {
		var nMaxChkOrder = ((sType=="FC" || sType=="EX" || sType=="QU") ? 2 : 3);
		var aRet = (nMaxChkOrder==2) ? [[],[]] : [[],[],[]];
		var oChk, nCount, i, j, nNewLen;
		for (var j=1;j<=nMaxChkOrder;j++) {
			oChk = oForm.elements[sType + j + 'mkid' + sMarketID];
			if (oChk) {
				if (oChk.length) {
					nCount = oChk.length;
					for (i=0;i<nCount;i++) {
						if (oChk[i].checked) {
							nNewLen = aRet[j-1].length;
							aRet[j-1][nNewLen] = i;		//	save index of the CHK in the collection
						}
					}
				} else {	//	just one checkbox. i know. just in case.
					if (oChk.checked) {
						nNewLen = aRet[j-1].length;
						aRet[j-1][nNewLen] = 0;
					}
				}
			}
		}
		return aRet;
	}

	//	returns number of ticked checkboxes in "any order" column
	function _GetNumberOfAny(oForm, sType, sMarketID) {
		var nRet = 0;
		var oChk = oForm.elements[sType + "0" + 'mkid' + sMarketID];
		if (!oChk) return 0;
		if (oChk.length) {
			var nCount = oChk.length;
			for (var i=0;i<nCount;i++) {
				if (oChk[i].checked)
					nRet++;
			}
		} else {	//	just one checkbox. i know. just in case.
			if (oChk.checked)
				nRet++;
		}
		return nRet;
	}

	//	returns number of straight bets
	function _StraightBetsCount(aColumns, oForm, sType, nMaxChkOrder) {
		var i, j, k, nRet = 0;
		if (nMaxChkOrder == 2) {
			for (i=0;i<aColumns[0].length;i++) {
				for (j=0;j<aColumns[1].length;j++) {
					if (aColumns[0][i] != aColumns[1][j]) {
						nRet++;
					}
				}
			}
		} else {
			for (i=0;i<aColumns[0].length;i++) {
				for (j=0;j<aColumns[1].length;j++) {
					if (aColumns[0][i] != aColumns[1][j]) {
						for (k=0;k<aColumns[2].length;k++) {
							if (aColumns[1][j] != aColumns[2][k] && aColumns[0][i] != aColumns[2][k]) {
								nRet++;
							}
						}
					}
				}
			}
		}
		return nRet;
	}

	function _Factorial(q) {
		if( (q==0)||(q==1) ){
			return 1;
		} else {
			var qn = (q*_Factorial(q-1));
			return qn;
		}
	}

	function _ClearStraight(oForm, sType, nMaxChkOrder, sMarketID) {
		var i, j;
		for (var j=1;j<=nMaxChkOrder;j++) {
			var aChk = oForm.elements[sType + j + 'mkid' + sMarketID];
			if (!aChk) continue;
			for (var i=0;i<aChk.length;i++)
				aChk[i].checked = false;
		}
		var oBetType = document.getElementById("rpbettype" + sType);
		if (oBetType) oBetType.value = "";
	}

	function _ClearAny(oForm, sType, sMarketID) {
		var aChk = oForm.elements[sType + '0' + 'mkid' + sMarketID];
		if (!aChk) return;
		for (var i=0;i<aChk.length;i++)
			aChk[i].checked = false;
		var oBetType = document.getElementById("rpbettype" + sType);
		if (oBetType) oBetType.value = "";
	}
	
	this.Submit = function(oBtn) {
		var oForm = oBtn.form;
		oForm.onsubmit = function() {
			if (RP.bIsTotalStakeTooLow) {
				if (BS_MsgTotalStakeTooLow != "") alert(BS_MsgTotalStakeTooLow + " " + RP.sCurrency + " " + RP.nMinimumStake);
				return false;
			}
			oForm.action = "/betplace/index.asp";
			return true;
		};
	};

	return this;
};

RP = new RP_Constructor();
//DomLoaded.load(RP.Init);


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	LiveUpdateSetup.js - v3.0
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Copyright (c) 2003, 2007, Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

var LU = null;
var LU_Constructor = function() {
    var self = this;
    var _bReady = false;

    /*
    PROPERTIES	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    */
    this.sUpdLnk = ""; 						//	URL for page refresh
    this.nInterval = -1; 						//	refresh interval in milliseconds. -1 = LU is off
    this.nBSInterval = -1; 					//	refresh interval in milliseconds. -1 = LU is off
    this.sServerURL = "";
    this.sBSServerURL = "/finsoft/betting/LUBetslip.asp";
    this.bShowCurrentScore = false;
    this.nIntervalAddedGracePeriod = 1000; //	in milliseconds

    //	these execute remote calls
    this.oBSsrv = new AjaxConn();
    if (this.oBSsrv)
        this.oBSsrv.Done = function() { if (LU) LU.ProcessBS(this.responseText); };

    this.oMsrv = new AjaxConn();
    if (this.oMsrv)
        this.oMsrv.Done = function() { if (LU) LU.Process(this.responseText); };

    /*
    METHODS		- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    */
    this.Init = function(bV) {
        self.Start();
        _bReady = true;
    };

    //	page refresh
    this.RefreshPage = function() {
        var s = unescape(this.sUpdLnk);
        if (s == "") return;
        //	s = s.replace(/&amp;/gi, "&");
        if (typeof (location.replace) == "object")
            location.replace(s);
        else
            location.href = s;
    };

    //	
    this.Start = function(sWhat) {
        if (typeof (sWhat) == "undefined") sWhat = "";

        if (sWhat == "" || sWhat == "BS") {
            if (self.nBSInterval > -1)
                setTimeout("LU.CheckBS()", self.nBSInterval);
        }
        if (sWhat == "" || sWhat == "BN") {
            if (self.nInterval > -1)
                setTimeout("LU.Check()", self.nInterval);
        }
    };

    //	
    this.Check = function() {
        var sURL = self.sServerURL;
        if (sURL != "") {
            var sQS = "i=" + ((self.nInterval + self.nIntervalAddedGracePeriod) / 1000); 	//	divide by 1000 to get it in seconds
            self.oMsrv.connect("POST", sURL, sQS);
        }
    };
    this.CheckBS = function() {
        var sURL = self.sBSServerURL;
        if (sURL != "") {
            var sQS = "i=" + ((self.nBSInterval + self.nIntervalAddedGracePeriod) / 1000); 	//	divide by 1000 to get it in seconds
            sQS += "&s=" + BS.GetSelectionIDCSV();
            self.oBSsrv.connect("POST", sURL, sQS);
        }
    };

    //	
    this.ProcessBS = function(vChanged) {
        var bPageRefresh = false;
        if (vChanged && vChanged != '{,}') {
            var oChanged = JSON.parse(vChanged);
            if (oChanged.BS)
                if (_BetslipChanges(oChanged.BS)) return;
        }
        //	start again
        self.Start("BS");
    };

    //	
    this.Process = function(vChanged) {
        var bPageRefresh = false;
        if (vChanged && vChanged != '{,}') {
            var oChanged = JSON.parse(vChanged);
            //	if any of the following 3 functions returns true, it means page refresh is happening, so stop all further processing
            if (oChanged.HP)
                if (_HomepageChanges(oChanged.HP)) return;
            if (oChanged.MK)
                if (_MarketChanges(oChanged.MK)) return;
            if (oChanged.SL)
                if (_SelectionChanges(oChanged.SL)) return;
        }
        //	start again
        self.Start("BN");
    };

    function _HomepageChanges(aHP) {
        var oHP, sAction;
        for (var i = 0; i < aHP.length; i++) {
            oHP = aHP[i];

            //	if there are changes in InR offer OR more bets count for shown events has changed, do refresh
            if (oHP.changecount > 0) {
                self.RefreshPage();
                return true;
            }

            return false;
        }
    }

    /*
    apply all market changes in the previous period
    return true if page refresh is needed

			possible values for ACTION:
    OPENED
    ABANDONED
    AMENDED
    CLOSED
    CREATED
    RESULTED
    SETTLED
    UNSETTLED
    SUSPENDED
    Take over
    OFF
    ON
    PRICE TYPE UPDATE
    EW			  	 --EW 1/1 For 5
    HCAP	 		--HCAP-1, HCAP-.5, HCAP-16 
    BetEnd
    BetStart
    CHi
    CLow
    CMid
    ISAA
    MB/L
    S/T
    */
    function _MarketChanges(aMK) {
        var oMK, sID, sAction;
        for (var i = 0; i < aMK.length; i++) {
            oMK = aMK[i];

            sAction = oMK.action.toUpperCase();

            //	if market OFF, do refresh
            if (oMK.isoff) {
                self.RefreshPage();
                return true;
            }

            //	if market is closed, do refresh
            if (oMK.idfobolifestate == "C") {
                self.RefreshPage();
                return true;
            }

            //	if handicap has changed, do refresh
            if (sAction.indexOf('HCAP') != -1) {		// && oMK.currentmatchhandicap != ""
                self.RefreshPage();
                return true;
            }

            //	if EW offer has changed, do refresh.
            //		##	TBD, if ever needed

            //	set open/suspended state
            sID = "t" + oMK.idfomarket;
            if (oMK.istradable)
                BN_Unsuspend(sID);
            else
                BN_Suspend(sID);

            return false;
        }
    }

    /*
    apply all selection changes in the previous period
    return true if page refresh is needed

			possible values for ACTION:
    NEW PRICE: U/D				(U/D = CurrentPriceUp/CurrentPriceDown)
    NEW							(means selection is just created)
    CURRENT SCORE: +X			(i.e. +3, -1)

			SUSPENSION TYPE: N/O
    HIDDEN FROM: XX			(XX = BS,CC or nothing or N/O or W3 etc)
    NOT TRADABLE ON: XX		(XX = BS,CC or nothing or N/O or W3 etc)
    NON RUNNER TYPE: X		(X = NR or WD)
    WITHDRAWN

			CURRENT BANDS: X-Y		(i.e. 10-11, 20-30 etc)
    CURRENT HANDICAP: X		(X is 0, -1, 4 etc)

			RESULT: X					(X can be W, L)
    RESULT POSITION: X		(X is integer)
    MAXBOOKLOSS: X				(X = 100, 1000 etc)
    MAXMULTCAPPEDCONTRIBUTION_H: X
    MAXMULTCAPPEDCONTRIBUTION_L: X
    MAXSINGLESTAKEOUT: X
    SETTLED
    */
    function _SelectionChanges(aSL) {
        var oSL, sID, sAction;
        var oPrc, oPrevPrc, oSelName, sSelName, sOldName, sCurScore;
        for (var i = 0; i < aSL.length; i++) {
            oSL = aSL[i];
            sID = oSL.idfoselection;
            sAction = oSL.action.toUpperCase();

            //	if action is NON TRADABLE, then refresh page to load new display
            if (sAction.indexOf('NOT TRADABLE ON') != -1) {		//	&& oSL.nontradableon.indexOf('W3') != -1
                self.RefreshPage();
                return true;
            }

            //	if action is HIDDEN FROM, then refresh page to load new status
            if (sAction.indexOf('HIDDEN FROM') != -1) {		//	&& oSL.hiddenfrom.indexOf('W3') != -1
                self.RefreshPage();
                return true;
            }

            //	if action is SUSPENSION TYPE, then refresh page to load new status
            if (sAction.indexOf('SUSPENSION TYPE') != -1) {		//	
                oPrc = document.getElementById("LU_" + sID);
                if (oPrc) {
                    if (sAction.indexOf('W3') == -1) {//	FO price is enabled
                        oPrc.innerHTML = oSL.userprice;
                    } else {//	FO price is disabled
                        oPrc.innerHTML = '<span class="FOprcinfo" title="' + FS_I18N('no fixed odds price available, add to slip to see price options') + '">?</span>';
                    }
                    //	set visual marker
                    oPrc.parentNode.parentNode.className += " valchg";
                }
            }

            //	if price has changed, update it
            if (sAction.indexOf('NEW PRICE') != -1 && oSL.userprice != "") {
                oPrc = document.getElementById("LU_" + sID);
                if (oPrc) {
                    //	update previous prices if they exists
                    oPrevPrc = document.getElementById("LU_" + sID + "_PP");
                    if (oPrevPrc)
                        _UpdatePrevPrices(oPrevPrc, oPrc);
                    //	update the price itself
                    oPrc.innerHTML = oSL.userprice;
                    //	set visual marker
                    oPrc.parentNode.parentNode.className += " valchg";
                }
            }
            //	update selection name. include current score
            if ((sAction.indexOf('CURRENT SCORE') != -1 || sAction.indexOf('CURRENT BANDS') != -1) && oSL.selectionname != "") {
                oSelName = document.getElementById("LU_" + sID + "_SN");
                if (oSelName) {
                    sSelName = oSL.selectionname;
                    if (self.bShowCurrentScore) {
                        sCurScore = oSL.currentscore;
                        if (sCurScore != "")
                            sSelName += " (" + sCurScore + ")";
                        else {
                            //	check if there is an old current score. if yes, add it to selname
                            sOldName = oSelName.innerHTML;
                            nPos = sOldName.indexOf("(");
                            if (nPos != -1)
                                sSelName += sOldName.substring(nPos);
                        }
                    }
                    oSelName.innerHTML = sSelName;
                    //	set visual marker
                    oSelName.className += " valchg";
                }
            }
        }

        return false;
    }

    //	checks what is changed and then calls the BS method to re-read changed selections into slip
    function _BetslipChanges(arrBS) {
        var oBS, sID, sAction, sAllIDs;
        sAllIDs = "";
        for (var i = 0; i < arrBS.length; i++) {
            oBS = arrBS[i];
            sID = oBS.idfoselection;
            sAction = oBS.action.toUpperCase();
            if (sAction.indexOf('NEW PRICE') != -1 || sAction.indexOf('CURRENT HANDICAP') != -1 || sAction.indexOf('CURRENT BANDS') != -1)
                sAllIDs += ',' + sID;
        }
        if (sAllIDs.length != 0) {
            sAllIDs = sAllIDs.substring(1);
            if (BS)
                BS.ReRead(sAllIDs);
        }
    }

    //	update previous prices field with current price change
    function _UpdatePrevPrices(oPrevPrc, oPrc) {
        var s = oPrevPrc.innerHTML;
        //	removes spaces at the ends, or possible double spaces
        if (s.charAt(0) == " ")
            s = s.substring(1);
        if (s.charAt(s.length - 1) == " ")
            s = s.substring(0, s.length - 1);
        s = s.replace("  ", " ");
        //	update
        var aTmp = s.split(" ");
        if (aTmp.length > 2)
            s = aTmp[1] + " " + aTmp[2];
        s += " " + oPrc.innerHTML;
        oPrevPrc.innerHTML = s;
    }

    return this;
};

LU = new LU_Constructor();

DomLoaded.load(LU.Init);




