/*
* $Id: zesk.js 272 2009-12-28 17:14:45Z kent $
*
* Copyright (C) 2007 Market Acumen, Inc. All rights reserved
*/

var _ud = "undefined";
var _udi = -9381232;	// Undefined Integer (preserves type)

/******************************************************************************\
* Kernel
\******************************************************************************/

/* Globals storage container */
var _zesk_ = {};

/* Kernel */
function avalue(obj, i/* def */) {
	var def = arguments.length > 2 ? arguments[2] : null;
	if (typeof obj == "object") {
		if (typeof obj[i] != "undefined") return obj[i];
		return def;
	}
	return def;
}

function is_object(a) {
	return typeof a === "object" && !is_array(a);
}

function is_array(a) {
	return Object.prototype.toString.call(a) === '[object Array]';
}

function is_bool(a) {
	return typeof a === 'boolean';
}

function is_string(a) {
	return typeof a === "string";
}

function is_number(a) {
	return typeof a === "number";
}

function is_numeric(a) {
	return typeof a === "number";
}

function is_integer(a) {
	return typeof a === "number" && parseInt(a,10) === a;
}

function is_float(a) {
	return typeof a === "number" && parseInt(a,10) !== a;
}

function is_date(a) {
	return Object.prototype.toString.call(a) === '[object Date]';
}

function is_url(x) {
	return /^http:\/\/.+|^https:\/\/.+|^mailto:.+@.+|^ftp:\/\/.+|^file:\/\/.+|^news:\/\/.+/.exec(x.toLowerCase().trim());
}

function gettype(x) {
	if (x === null) {
		return 'null';
	}
	return Object.prototype.toString.call(x).split(' ')[1].split(']')[0].toLowerCase();
}

Array.prototype.contains = function (x) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] === x) {
			return true;
		}
	}
	return false;
}

function each(x, fn/*, term_value */) {
	term_value = arguments[2] || null;
	if (is_array(x)) {
		for (var i = 0; i < x.length; i++) {
			var r = fn(i,x[i]);
			if (r !== term_value) {
				return r;
			}
		}
	} else if (is_object(x)) {
		for (var i in x) {
			if (x.hasOwnProperty(i)) {
				var r = fn(i,x[i]);
				if (r !== term_value) {
					return r;
				}
			}
		}
	} else {
		return fn(0, x);
	}
	return term_value;
}

String.prototype.compare = function(a) {
	return (this < a) ? -1 : (this === a) ? 0 : 1;
}

String.prototype.left = function (delim) {
	var pos;
	if ((pos = this.indexOf(delim)) < 0) {
		return arguments[1] || this;
	}
	return this.substr(0, pos);
};

String.prototype.rleft = function (delim) {
	var pos;
	if ((pos = this.lastIndexOf(delim)) < 0) {
		return arguments[1] || this;
	}
	return this.substr(0, pos);
};

String.prototype.right = function (delim) {
	var pos;
	if ((pos = this.indexOf(delim)) < 0) {
		return arguments[1] || this;
	}
	return this.substr(pos+delim.length);
};

String.prototype.rright = function (delim) {
	var pos;
	if ((pos = this.lastIndexOf(delim)) < 0) {
		return arguments[1] || this;
	}
	return this.substr(pos+delim.length);
};

String.prototype.ltrim = function () {
	return this.replace(/^\s+/,'');
};

String.prototype.rtrim = function () {
	return this.replace(/\s+$/,'');
};

String.prototype.trim = function () {
	return this.replace(/^\s+/,'').replace(/\s+$/,'');
};

String.prototype.ends_with = function(x) {
	var xn = x.length;
	var n = this.length;
	if (xn > n) {
		return false;
	}
	if (this.substring(n-xn,n) == x) {
		return true;
	}
	return false;
};

String.prototype.str_replace = function (s,r)
{
	var str = this; var i;
	if (is_string(s)) {
		if (is_string(r)) {
			return this.split(s).join(r);
		}
		for (i = 0; i < r.length; i++) {
			str = str.str_replace(s,r[i]);
		}
		return str;
	}
	if (is_string(r)) {
		for (i = 0; i < s.length; i++) {
			str = str.str_replace(s[i],r);
		}
		return str;
	}
	var n = Math.min(s.length,r.length);
	for (i = 0; i < n; i++) {
		str = str.str_replace(s[i],r[i]);
	}
	return str;
};

String.prototype.map = function (a/* , case_sensitive=false*/) {
	var case_sensitive = arguments.length > 1 ? arguments[1] : false;
	if (!is_object(a)) {
		return this;
	}
	var suffix = "";
	if (!case_sensitive) {
		a = object_change_key_case(a);
		suffix = "i";
	}
	s = []; r = [];
	str = this;
	for (var k in a) {
		if (a.hasOwnProperty(k)) {
			var v = a[k];
			if (!is_object(v)) {
				str = str.replace(new RegExp("\\{"+k+"\\}"+suffix),v);
			}
		}
	}
	return str;
};

function to_integer(x) {
	var d = arguments.length > 1 ? arguments[1] : null;
	x = parseInt(x,10);
	if (typeof x === 'number') {
		return x;
	}
	return d;
}

function to_float(x) {
	var d = arguments.length > 1 ? arguments[1] : null;
	x = parseFloat(x);
	if (typeof x === 'number') {
		return x;
	}
	return d;
}

function to_string(x) {
	return x.toString();
}
function to_bool(x) {
	var d = arguments.length > 1 ? arguments[1] : false;
	if (is_bool(x)) {
		return x;
	}
	if (is_numeric(x)) {
		return (x !== 0);
	}
	if (is_string(x)) {
		if (['t','true','1','enabled','y','yes'].contains(x)) {
			return true;
		}
		if (['f','false','0','disabled','n','no'].contains(x)) {
			return false;
		}
	}
	return d;
}

function empty(v) {
	return typeof v === "undefined" || v === null || v === "";
}


function _G(n) {
	var a = arguments;
	return avalue(_zesk_, n, a.length > 1 ? a[1] : null);
}

function _Gb(n) {
	var a = arguments, d = a.length > 1 ? a[1] : false;
	return to_bool(_G(n,d));
}

function _S(n,v) {
	var a = arguments, overwrite = a.length > 2 ? to_bool(a[2]) : true;
	if (!overwrite && typeof _zesk_[n] !== _ud) {
		return _zesk_[n];
	}
	_zesk_[n] = v;
	return v;
}

function unquote(x) {
	var n = x.length;
	var q = arguments[1] || '""\'\'';
	var p = q.indexOf(x.substring(0,1));
	if (p < 0) {
		return x;
	}
	if (x.substring(n-1,n) == q.charAt(p+1)) {
		return x.substring(1,n-1);
	}
	return x;
}

function object_change_key_case(o)
{
	var no = {};
	for (var k in o) {
		if (o.hasOwnProperty(k)) {
			no[k.toLowerCase()] = o[k];
		}
	}
	return no;
}

/******************************************************************************\
* Maniplation
\******************************************************************************/
/**
* Enter description here...
*
* @param unknown_type mixed
* @return array
*/
function html_attributes_parse(mixed)
{
	if (typeof mixed == 'object') return mixed;
	var x = new Object();
	if (typeof mixed != 'string') return x;
	var pattern = / *([A-Za-z][-_:A-Za-z0-9]*)=("[^"]*"|'[^']*'|[^"'\s]+)/; //'
	mixed = " " + mixed;
	var result;
	while (result = pattern.exec(mixed)) {
		x[result[1]] = unquote(unhtmlspecialchars(result[2]));
		mixed = mixed.substring(result.index + result[0].length);
	}
	return x;
}

function html_attributes(attrs)
{
	attrs = html_attributes_parse(attrs);
	var result = "";
	for (var k in attrs) {
		result = result + " " + k.toLowerCase() + "=\"" + htmlspecialchars(attrs[k]) + "\"";
	}
	return result;
}


function str_replace(search, replace, subject)
{
	return subject.split(search).join(replace);
}


function tage(name, attrs, data)
{
	if ($.trim(data) == "") {
		return "";
	}
	return tag(name, attrs, data);
}

function tag(name, attrs, data)
{
	name = name.toLowerCase();
	var result = "<" + name + html_attributes(attrs);
	return result + ((data == null || typeof data == "undefined") ? " />" : ">" + data + "</" + name + ">");
}

function add_zero(x)
{
	if (x < 10) return "0" + x;
	return x;
}

function htmlentities()
{
	return {
	'&': '&amp;',
	'<': '&lt;',
	'>': '&gt;',
	'"': '&quot;'
	};
}
function htmlspecialchars(x)
{
	var e = htmlentities()
	x = "" + x;
	for (var k in e) {
		if (e.hasOwnProperty(k)) {
			x = str_replace(k,e[k],x);
		}
	}
	return x;
}

function unhtmlspecialchars(x)
{
	var e = htmlentities()
	x = "" + x;
	for (var k in e) {
		if (e.hasOwnProperty(k)) {
			x = str_replace(e[k],k,x);
		}
	}
	return x;
}

function hex_decode(x)
{
	var h = "0123456789ABCDEF";
	var r = [];
	x = x.toUpperCase();
	for (var i = 0; i < x.length; i = i + 2) {
		r[r.length] = (h.indexOf(x[i])<<4)|h.indexOf(x[i+1]);
	}
	return r;
}

function hex_encode(x)
{
	var h = "0123456789ABCDEF";
	var r = ""; var c;
	for (var i = 0; i < x.length; i++) {
		c = x[i];
		r = r + h[(c>>4)&0x0F] + h[c&0x0F]
	}
	return r;
}

function count_occurances(haystack, needle) {
	var n = haystack.split(needle).length;
	return n - 1;
}

/********************************************************************************\
*
*    Locale functionalilty
*
\********************************************************************************/

function locale() {
	var a = arguments;
	if (a.length > 0) {
		return _S('locale', a[0]);
	}
	return _G('locale', 'en_US');
}
function language() {
	var x = to_string(arguments[0] || locale());
	return x.left('_', 'en').toLowerCase();
}
function region() {
	var x = to_string(arguments[0] || locale());
	return x.right('_', 'US').toUpperCase();
}

function translation(locale, map) {
	var tt = _G('translation-table',{});
	locale = locale.toLowerCase();
	if (avalue(tt, locale) === null) {
		tt[locale] = {};
	}
	for (var k in map) {
		if (map.hasOwnProperty(k)) {
			tt[locale][k] = map[k].toString();
		}
	}
	_S('translation-table', tt);
}

String.prototype._T = function (/* locale=null, default=null */) {
	var a = arguments, loc = a[0] || locale(), text = this.toString(), phrase = this.right('::', this), def = a.length > 1 ? a[1] : phrase;
	var tt = _G('translation-table');
	var tt = [ avalue(tt, loc, {}), avalue(tt, language(loc), {}) ], matches;
	var r = each(tt, function(i,t) { return t[text] || null; });
	if (r) { return r; }
	r = each(tt, function(i,t) { return t[phrase] || null; });
	if (r) { return r; }
	r = each(tt, function(i,t) { return t[phrase.toLowerCase()] || null; });
	if (r) { return case_match_simple(r,phrase); }
	return def;
}

String.prototype._M = function () {
	var a = arguments, s = this.toString(), i;
	for (i = 0; i < a.length; i++) {
		s = s.str_replace('{'+i+'}', a[i].toString());
	}
	return s;
}

function case_match_simple(string, pattern) {
	var char1 = pattern.substr(0,1);
	var char2 = pattern.substr(1,1);
	if (char1 === char1.toLowerCase(char1)) {
		return string.toLowerCase();
	} else if (char2 === char2.toLowerCase()) {
		return string.substring(0,1).toUpperCase() + string.substring(1).toLowerCase();
	} else {
		return string.toUpperCase();
	}
}

translation('en', {
'plural:day': 'days',
'plural:staff': 'staff',
'plural:sheep': 'sheep',
'plural:octopus': 'octopi',
'plural:news': 'news'
});

function plural_en(s/*, n=2 */)
{
	var n = to_integer(arguments[1] ||  2, 2);
	if (n === 1) {
		return s;
	}
	var ess = ('plural:' + s.toLowerCase())._T('en', null);
	if (ess) {
		return ess;
	}
	var s2 = s.substring(s.length-2);
	var s1 = s.substring(s.length-1);
	switch (s1) {
		case 'x': return s+"es";
		case 'y': return s.substring(0,s.length-1)+"ies";
	}
	return s+'s';
}

function plural(s/*, n=2, locale=null */) {
	var n = to_integer(arguments[1], 2);
	var locale = arguments[2];
	switch (language(locale)) {
		default:
		case "en":
		return plural_en(s, n, locale)
	}
}

function plural_n(noun/* , n=2, locale=null */)
{
	var n = to_integer(arguments[1], 2);
	var loc = arguments[2] || locale();
	var lang = language(loc);
	return 'plural_n::{0} {1}'._T()._M(n, plural(noun,n));
}

function these(noun/* , n=2, locale=null */)
{
	var n = to_integer(arguments[1], 2);
	var locale = arguments[2];
	if (n === 1) {
		return "these::this {0}"._T()._M(noun);
	}
	return 'these::these {0}'._T()._M(plural_n(noun, n));
}


function ordinal(n, lang/*, gender="m" */)
{
	lang = lang || "en";
	var gender = arguments[2] || 'm';
	switch (lang) {
		case "de":
		var articles = {m:'der',f:'die',n:'das'};
		var article = articles[gender] || articles['m'];
		return article + " " + n + ".";
		case "fr":
		if (n === 1) {
			return n + (gender == 'm' ? 'er' : '&egrave;re');
		}
		return n + 'e';
		default: // "en"
		if ((n + 90) % 100 < 10) {
			return n + "th";
		}
		switch (n % 10) {
			case 1: return n + "st";
			case 2: return n + "nd";
			case 3: return n + "rd";
			default: return n + "th";
		}
	}
	return n;
}

/**
* Dates in french do not use the ordinal except for the 1st
* Other languages vary. English always uses the 1st.
*/
function date_ordinal(n, lang)
{
	switch (lang) {
		case "de":
		return "der $n.";
		case "fr":
		if (n == 1) {
			return ordinal(n, lang);
		}
		return n;
		default: // en
		return ordinal(n, lang);
	}
}

/********************************************************************************\
*
*    Date functionalilty
*
\********************************************************************************/

Date.prototype.type = "date";
Date.prototype.add = function (y,m,d) {
	if (y) {
		this.setUTCFullYear(this.getUTCFullYear()+y);
	}
	if (m) {
		this.setUTCMonth(this.getUTCMonth(m)+(m%12));
		y = y + parseInt(m/12,10);
	}
	if (d) {
		var t = this.getTime();
		t = t + (d * 86400000);
		this.setTime(t);
	}
};
Date.prototype.add_zero = function(x) {
	return (x >= 10) ? x : "0" + x;
};
Date.prototype.midnight = function() {
	this.setHours(0);
	this.setMinutes(0);
	this.setSeconds(0);
};
Date.prototype.midnightUTC = function() {
	this.setUTCHours(0);
	this.setUTCMinutes(0);
	this.setUTCSeconds(0);
};
Date.prototype.localeMonth = function(lang) {
	var format = arguments[1] || "normal";
	var mm = this.localeMonths(lang, format);
	return mm[this.getUTCMonth()];
};
Date.prototype.localeMonths = function(lang) {
	var format = arguments[1] || "normal";
	switch (lang) {
		case "de":
		switch (format) {
			case "single": 	return ['J','F','M','A','M','J','J','A','S','O','N','D']; // NOT CONFIRMED: TODO
			case "min": 	return ['Ja','Fe','M&auml;','Ap','Ma','Ju','Jl','Au','Se','Ok','No','De']; // NOT CONFIRMED: TODO
			case "short": 	return ['Jan','Feb','M&auml;r','Apr','Mai','Jun','Jul','Aug','Sept','Okt','Nov','Dez'];
			default:		return ['Januar','Februar','M&auml;rz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'];
		}
		break;
		case "fr": 	// Source: http://fr.wikipedia.org/wiki/Mois#Abr.C3.A9viations
		switch (format) {
			case "single":	return ['j','f','m','a','m','j','j','a','s','o','n','d'];
			case "min":		return ['jr','fr','ms','al','ma','jn','jl','au','se','oc','no','de'];
			case "short":	return ['jan','f&eacute;v','mar','avr','mai','jun','jul','ao&uuml;','sep','oct','nov','d&eacute;c'];
			default:		return ['janvier','f&eacute;brier','mars','avril','mai','juin','juillet','ao&uuml;t','septembre','octobre','novembre','d&eacute;cembre'];
		}
		break;
		default:  //en
		switch (format) {
			case "single":	return ["J","F","M","A","M","J","J","A","S","O","N","D"];
			case "min":		return ["Ja","Fe","Ma","Ap","Ma","Jn","Jl","Au","Se","Oc","No","De"];
			case "short":	return ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
			default:		return ["January","February","March","April","May","June","July","August","September","October","November","December"];
		}
		break;
	}
};
Date.prototype.localeWeekday = function(lang) {
	var format = arguments[1] || "normal";
	var mm = this.localeWeekdays(lang, format);
	return mm[this.getUTCDay()];
};
Date.prototype.localeWeekdays = function(lang) {
	var format = arguments[1] || "normal";
	switch (lang) {
		case "de":
		switch (format) {
			case "single":	return ["S", "M", "D", "M", "D", "F", "S"];
			case "short":	return ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"];
			case "min":		return ['So','Mo','Di','Mi','Do','Fr','Sa'];
			default:		return ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'];
		}
		break;
		case "fr":
		switch (format) {
			case "single":	return ['d','l','m','m','j','v','s'];
			case "short":	return ['dim','lun','mar','mer','jeu','ven','sam'];
			case "min":		return ['di','lu','ma','me','je','ve','sa'];
			default:		return ['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'];
		}
		break;
		default:  // en
		switch (format) {
			case "single":	return ["S","M","T","W","T","F","S"];
			case "short":	return ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
			case "min":		return ["Su","Mo","Tu","We","Th","Fr","Sa"];
			default:		return ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
		}
		break;
	}
};
Date.prototype.localeWeekdaysMin = function (lang) {
	return Date.prototype.localeWeekdays(lang, "min");
};
Date.prototype.localeWeekHeader = function (lang) {
	var wkheader = { en: 'Wk', fr: "Se", de: 'Wo' };
	return wkheader[lang] || wkheader.en;
};
Date.prototype.isLastDayOfMonth = function () {
	return this.daysInMonth() == this.getUTCDate();
};
Date.prototype.daysInMonth = function () {
	var m = this.getUTCMonth();
	return [31,28 + ((this.getUTCFullYear() % 4 === 0) ? 1 : 0),31,30,31,30,31,31,30,31,30,31][m];
};
Date.prototype.format = function(format_string) {
	var x = {};
	var lang = arguments[1] || "en";
	x.YYYY = ""+this.getUTCFullYear();
	x.YY = x.YYYY.substring(0,2);
	x.MMMM = this.localeMonth(lang);
	x.MMM = this.localeMonth(lang,'short');
	x.WWWW = this.localeWeekday(lang);
	x.WWW = this.localeWeekday(lang, "short");
	x.WW = this.add_zero(this.getUTCDay());
	x.W = this.getUTCDay();
	x.MM = this.add_zero(this.getUTCMonth()+1);
	x.M = this.getUTCMonth()+1;
	x.DDD = date_ordinal(this.getUTCDate(), lang);
	x.DD = this.add_zero(this.getUTCDate());
	x.D = this.getUTCDate();
	return format_string.map(x, true);
};

Date.prototype.dateString = function() {
	return this.getUTCFullYear() + "-" + this.add_zero(this.getUTCMonth()+1) + '-' + this.add_zero(this.getUTCDate());
};

Date.prototype.equalDates = function(d) {
	if (is_date(d)) {
		return d.dateString() == this.dateString();
	}
	return false;
};

Date.prototype.equalMonths = function(d) {
	if (is_date(d)) {
		return d.getUTCMonth() == this.getUTCMonth();
	}
	return false;
};

Date.prototype.equalYears = function(d) {
	if (is_date(d)) {
		return d.getUTCFullYear() == this.getUTCFullYear();
	}
	return false;
};

/**
* Formats are:
*	d: A single day
*  m: A single month
*  m: Between months
*  dd: Same month, same year, with two different dates
*  mmdd: Custom day of month, dates across months, same year
*  mdyy: Dates across years.
*/
Date.prototype.formatRangeStrings = function() {
	return {
		de: {
			D: [ "{WWWW}, der {D}. {MMMM}, {YYYY}", "" ],
			M: [ "{MMMM} {YYYY}", "" ],
			MM: [ "vom {MMMM}", " bis zum {MMMM}, {YYYY}" ],
			MMDD: [ "vom {D}. {MMMM}", " bis zum {D}. {MMMM}, {YYYY}" ],
			DD: [ "vom {D}. {MMMM} bis zum", " {D}., {YYYY}"],
			MDYY: [ "vom {D}. {MMMM}, {YYYY}", " bis zum {D}. {MMMM}, {YYYY}" ]
		},
		en: {
			D: [ "{WWWW}, {MMMM} {DDD}, {YYYY}", "" ],
			M: [ "{MMMM} {YYYY}", "" ],
			MM: [ "{MMMM}", " - {MMMM}, {YYYY}" ],
			MMDD: [ "{MMMM} {DDD}", " - {MMMM} {DDD}, {YYYY}" ],
			DD: [ "{MMMM} {DDD}", " - {DDD}, {YYYY}"],
			MDYY: [ "{MMMM} {DDD}, {YYYY}", " - {MMMM} {DDD}, {YYYY}" ]
		},
		fr: {
			D: [ "le {WWWW} {DDD} {MMMM} {YYYY}", "" ],
			M: [ "{MMMM} {YYYY}", "" ],
			MM: [ "{MMMM}", " - {MMMM} {YYYY}" ],
			MMDD: [ "{DDD} {MMMM}", " - {DDD} {MMMM} {YYYY}" ],
			DD: [ "{DDD}", " - {DDD} {MMMM} {YYYY}"],
			MDYY: [ "{DDD} {MMMM} {YYYY}", " - {DDD} {MMMM} {YYYY}" ]
		}
	};
};

Date.prototype.formatRange = function (end_date/*, language="en" */) {
	var language = arguments[1] || "en";
	var start_format = "";
	var end_format = "";
	var formats = this.formatRangeStrings();
	if (this.equalDates(end_date)) {
		which = 'D';
	} else if (!this.equalYears(end_date)) {
		which = 'MDYY';
	} else if (!this.equalMonths(end_date)) {
		which = (this.getUTCDate() == 1 && end_date.isLastDayOfMonth()) ? 'MM' : 'MMDD';
	} else if (this.getUTCDate() == 1 && end_date.isLastDayOfMonth()) {
		which = "M";
	} else {
		which = "DD";
	}
	if (!formats[language]) {
		language = "en";
	}
	start_format = formats[language][which][0];
	end_format = formats[language][which][1];
	return this.format(start_format, language) + end_date.format(end_format, language);
};

/********************************************************************************\
*
*   Email functionality
*
\********************************************************************************/
function Email_Clean(e)
{
	var r = /[^\@A-Z0-9a-z_\.\-\']+/g;		// '
	e = e.replace(r, "");
	return e;
}

function Email_Valid(e)
{
	e = Email_Clean(e);
	var r = /^[^@]+@[a-z0-9][a-z0-9\.\-]+\.[a-z]{2,4}$/i;
	if (e.match(r)) {
		return true;
	}
	return false;
}

function round(n,digits)
{
	var mult = Math.pow(10,digits);
	return Math.round(n*mult)/mult;
}

function format_bytes(n)
{
	if (n > 1073741824) {
		return round((n / 1073741824),1) + " GB";
	} else if (n > 1048576) {
		return round((n / 1048576),1) + " MB";
	} else {
		return parseInt(n / 1024) + " KB";
	}
}


function Cookie_Find(name, def)
{
	var c = document.cookie;
	var s = c.indexOf(name + '=');
	if (s < 0) {
		return def;
	}
	s += name.length + 1;
	var e = c.indexOf(';', s);
	if (e < 0) { e = c.length; }
	return unescape(c.substring(s,e));
}

function Cookie_Set(name, value)
{
	var d = new Date(2020, 1, 1, 0, 0, 0);
	document.cookie = name + "=" + escape(value) + '; path=/; expires=' + d.toGMTString();
}


/* Deprecated */

var isByID		= (document.getElementById)						? true : false;
var isAll		= (document.all)								? true : false;

var isIE4		= (isAll && !isByID)							? true : false;
var isIE5		= (isAll && isByID)								? true : false;
var isIE6		= (navigator.userAgent.indexOf('MSIE 6') > 0) 	? true : false;
var isFF		= (navigator.userAgent.indexOf('FireFox') > 0)	? true : false;
var isIE		= (isIE4 || isIE5 || isIE6)						? true : false;

var isIECSS1	= (isAll && (isIE5 || isIE6) && document.compatMode && document.compatMode=='CSS1Compat') ?
true : false;

var isNS4		= (document.layers)								? true : false;
var isNS6		= (!isIE && !isAll && isByID)					? true : false;
var isNS		= (isNS4 || isNS6)								? true : false;
if (isNS4) {
	var nsWinX=window.innerWidth;
	var nsWinY=window.innerHeight;
}

var is4			= (isIE4 || isNS4)								? true : false;

var isOpera		= (navigator.userAgent.indexOf('Opera') > 0) 	? true : false;

/*
* Browser-specific
*/
function Frame_GetX(f)
{
	if (!f) {
		return 0;
	}
	if (isIECSS1) {
		return f.document.documentElement.scrollLeft;
	} else if (isAll) {
		return f.document.body.scrollLeft;
	}
	if (typeof f.pageXOffset == _ud) {
		return f.pageXOffset;
	}
	return 0;
}

function Frame_GetY(f)
{
	if (!f || f == _ud) {
		return 0;
	}
	if (isIECSS1) {
		return f.document.documentElement.scrollTop;
	} else if (isAll) {
		return f.document.body.scrollTop;
	}
	if (typeof f.pageYOffset == _ud) {
		return f.pageYOffset;
	}
	return 0;
}

function Frame_GetWidth(f)
{
	if (!f || f == _ud) {
		return 0;
	}
	if (isIECSS1) {
		return f.clientWidth;
	} else if (isAll) {
		return f.document.body.clientWidth;
	} else if (isNS4 || isByID) {
		return f.clientWidth;
	}
	return false;
}

function Window_Width()
{
	if (isIE) {
		return document.documentElement.clientWidth;
	}
	return window.innerWidth;
}

function Document_Body(d)
{
	var tags = d.getElementsByTagName('body');
	if (tags.length < 1) { return false; }
	return tags[0];
}

function Window_Height()
{
	if (isIE) {
		return document.documentElement.clientHeight;
	}
	return window.innerHeight;
}

function Frame_GetHeight(f)
{
	if (!f || f == _ud) {
		return false;
	}
	if (isIECSS1) {
		return f.clientWidth;
	} else if (isAll) {
		return f.document.body.clientHeight;
	} else if (isNS4 || isByID) {
		return f.clientHeight;
	}
	return false;
}

function FrameObject_Get(f,id)
{
	var x = null;
	if (isNS4) {
		x = f.document.filters.document.layers[id];
		if (x && x != _ud) {
			return x;
		}
	} else if (isIE4) {
		x = f.document.all[id];
	}
	else if (isByID) {
		x = f.document.getElementById(id);
	}
	if (x && x != _ud) {
		return x;
	}
	return null;
}

function FrameObject_GetStyle(f,id)
{
	var x = null;
	if (isNS4) {
		x = f.document.filters.document.layers[id];
		if (x && x != _ud) {
			return x;
		}
	} else if (isIE4) {
		x = f.document.all[id];
	} else if (isByID) {
		x = f.document.getElementById(id);
	}
	if (x && x != _ud) {
		return x.style;
	}
	return null;
}

/*
f		Frame
layer	layerID
text	layer text
*/
function Frame_WriteLayer(f, id, text)
{
	var x = FrameObject_Get(f, id);
	if (!x) {
		return false;
	}
	text +="\n";
	if (isNS4) {
		x = x.document;
		if (typeof x == _ud) {
			alert('x.document is ' + _ud);
			return false;
		}
		x.write(text);
		x.close();
	} else if (isAll) {
		x.innerHTML	= text;
	} else if (isByID) {
		var r = f.document.createRange();
		r.setStartBefore(x);
		frag = r.createContextualFragment(text);
		while(x.hasChildNodes()){
			x.removeChild(x.lastChild);
		}
		x.appendChild(frag);
	}
	return true;
}

function Event_GetX(e, f)
{
	if (isNS) {
		return e.pageX;
	}
	return (isIE5) ? event.x + Frame_GetX(f) : event.x;
}

function Event_GetY(e, f)
{
	if (isNS) {
		return e.pageY;
	}
	return (isIE5) ? event.y + Frame_GetY(f) : event.y;
}

function Object_GetStyle(id)
{
	var x = null;
	if (isNS4) {
		x = document.filters.document.layers[id];
		if (x && x != _ud) {
			return x;
		}
	} else if (isIE4) {
		x = document.all[id];
	} else if (isByID) {
		x = document.getElementById(id);
	}
	if (x && x != _ud) {
		return x.style;
	}
	return null;
}

function Object_Get(id)
{
	var x = null;
	if (isNS4) {
		x = document.filters.document.layers[id];
	} else if (isIE4) {
		x = document.all[id];
	} else if (isByID) {
		x = document.getElementById(id);
	}
	if (x && x != _ud) {
		return x;
	}
	return null;
}

function Object_GetHeight(x)
{
	if (x) {
		if (isIECSS1) {
			return x.offsetHeight;
		} else {
			return x.clientHeight;
		}
	}
	return false;
}

function Object_GetWidth(x)
{
	if (typeof x != "object") {
		return false;
	}
	if (isIECSS1) {
		return x.offsetWidth;
	} else {
		return x.clientWidth;
	}
}

function ObjectID_GetWidth(id)
{
	var x = Object_Get(id);
	return Object_GetWidth(x);
}

function ObjectID_GetHeight(id)
{
	var x = Object_Get(id);
	return Object_GetHeight(x);
}

function ObjectIDs_Width(x)
{
	var n = 0;
	for (var i = 0; i < x.length; i++) {
		n = n + ObjectID_GetWidth(x[i]);
	}
	return n;
}

function ObjectIDs_Height(x)
{
	var nn, n = 0;
	for (var i = 0; i < x.length; i++) {
		nn = ObjectID_GetHeight(x[i]);
		n = n + nn;
	}
	return n;
}


function Object_SetContents(obj, y)
{
	obj.innerHTML = y;
	return true;
}

function ObjectID_SetContents(id, y)
{
	var obj = Object_Get(id);
	if (!obj) {
		return false;
	}
	return Object_SetContents(obj, y);
}

function ObjectID_Prepend(id, y)
{
	var obj = Object_Get(id);
	if (!obj) {
		return false;
	}
	obj.outerHTML = y + obj.outerHTML;
}

function Object_Contents(obj)
{
	return obj.innerHTML;
}

function ObjectID_Contents(id)
{
	var obj = Object_Get(id);
	if (obj) {
		return obj.innerHTML;
	}
	return '';
}

function Object_Exists(id)
{
	return Object_Get(id) ? true : false;
}

function NS_OnResize()
{
	if (nsWinX != window.innerWidth || nsWinY != window.innerHeight) {
		location.reload();
	}
}

function Document_OnMouseMove(func)
{
	if (typeof func == _ud) {
		return false;
	}
	if (isNS4) {
		var nsWinX=window.innerWidth;
		var nsWinY=window.innerHeight;
		window.onresize = NS_OnResize;
	}
	if ((isNS4)||(isAll)||(isByID)){
		document.onmousemove=func;
		if (isNS4) {
			document.captureEvents(Event.MOUSEMOVE);
		}
		return true;
	}
	return false;
}

function ObjectID_DisplayHide(id)
{
	var x = Object_GetStyle(id);
	if (x) {
		var save_display = 'none';
		if (typeof x._save_display != _ud) {
			save_display = x._save_display;
		}
		x.display = save_display;
	}
}

function ObjectID_DisplayShow(id)
{
	var x = Object_GetStyle(id);
	if (x) {
		x._save_display = x.display;
		x.display = 'block';
	}
}

function ObjectID_DisplayShowOne(id,hideids)
{
	hideids = hideids.split(";");
	for (var i = 0; i < hideids.length; i++) {
		if (hideids[i].length > 0) {
			ObjectID_DisplayHide(hideids[i]);
		}
	}
	ObjectID_DisplayShow(id);
}

function ObjectID_Display(id, value)
{
	if (value) {
		ObjectID_DisplayShow(id);
	} else {
		ObjectID_DisplayHide(id);
	}
}

function Object_IsDisplay(x)
{
	if (!x) {
		alert("Object_IsDisplay(!x)");
		return false;
	}
	return (x.display === 'none' || x.display === '') ? false : true;
}

function ObjectID_IsDisplay(id)
{
	return Object_IsDisplay(Object_GetStyle(id));
}


function ObjectID_DisplayToggle(id)
{
	if (ObjectID_IsDisplay(id)) {
		ObjectID_DisplayHide(id);
		return false;
	} else {
		ObjectID_DisplayShow(id);
		return true;
	}
}

function ObjectID_ToggleLink(a,id0,id1,showText,hideText)
{
	var result = ObjectID_DisplayToggle(id0);
	ObjectID_DisplayToggle(id1);
	a.innerHTML = result ? showText : hideText;
}


function Object_Top(obj)
{
	if (!obj || obj == _ud) {
		return false;
	}
	var n = 0;
	while (obj) {
		n += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return n;
}

function Object_VisibleShow(x)
{
	if (!x) {
		alert("Object_VisibleShow: no x");
		return;
	}
	if (isNS4) {
		x.visibility = "show";
	} else if (isAll || isByID) {
		x.visibility = "visible";
	}
}

function Object_VisibleHide(x)
{
	if (!x) {
		return;
	}
	if (isNS4) {
		x.visibility = "hide";
	} else if (isAll || isByID) {
		x.visibility = "hidden";
	}
}

function Object_IsVisible(x)
{
	if (!x) {
		alert("Object_IsVisible: no x");
		return false;
	}
	if (isNS4) {
		return (x.visibility == "hide") ? false : true;
	} else if (isIE4 || isNS6) {
		return (x.visibility == "hidden") ? false : true;
	}
	return true;
}

function Object_VisibleToggle(x)
{
	if (!x) {
		return;
	}
	if (Object_IsVisible(x)) {
		Object_VisibleHide(x);
	} else {
		Object_VisibleShow(x);
	}
}

function Object_SetBackground(x)
{
	if (!x) {
		if (isNS4) {
			x.background.src			= null;
		} else if (isIE4 || isNS6) {
			x.backgroundImage			= "none";
		}
	} else {
		if (isNS4) {
			x.background.src			= x;
		} else if (isIE4 || isNS6) {
			x.backgroundImage			= "url("+x+")";
		}
	}
}

function ObjectID_VisibleToggle(id)
{
	return Object_VisibleToggle(Object_GetStyle(id));
}

function ObjectID_VisibleHide(id)
{
	return Object_VisibleHide(Object_GetStyle(id));
}

function ObjectID_VisibleShow(id)
{
	return Object_VisibleShow(Object_GetStyle(id));
}

function ObjectID_IsVisible(id)
{
	return Object_IsVisible(Object_GetStyle(id));
}

function Object_MoveTo(obj, x, y)
{
	if (!obj || obj == _ud) {
		return;
	}
	var sfx='px';
	if (is4) {
		if (!isAll) {
			sfx='';
		}
	} else if (!isByID) {
		return;
	}
	obj.left		= x+sfx;
	obj.top			= y+sfx;
}

function ObjectID_MoveTo(id, x, y)
{
	return Object_MoveTo(Object_GetStyle(id),x,y);
}

function Object_Left(obj)
{
	if (!obj || obj == _ud) {
		return false;
	}
	var n = 0;
	while (obj) {
		n += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return n;
}


/*
HTML Tools
*/
function _HTML_Tag(name, args, single)
{
	var a = args;
	var n, v;
	var r = [];
	r[r.length] = name;
	for (var i = 1; i < a.length; i += 2) {
		n = a[i];
		v = a[i+1];
		if (v !== 0 && (v === '' || v == _udi || v == _ud || typeof v == _ud)) {
			continue;
		}
		r[r.length] = n + '="' + v + '"';
	}
	return '<' + r.join(" ") + (single ? '/' : '') + '>';
}

function HTML_SingleTag(name)
{
	return _HTML_Tag(name, arguments, true);
}

function HTML_Tag(name)
{
	return _HTML_Tag(name, arguments, false);
}

function HTML_EndTag(name)
{
	return '</' + name + '>';
}

function IE_DHTML_Hack(form, hide)
{
	if (!isIE || isOpera) {
		return;
	}
	var i;
	var verb = (hide) ? "hidden" : "visible";
	for (i = 0; i < form.elements.length; i++) {
		if (form.elements[i].type.indexOf('select') === 0 && form.elements[i].name !== "") {
			form.elements[i].style.visibility = verb;
		}
	}
}

function Document_Scan(n, expr)
{
	var c, v, x, offset, result = [];
	for (var i=0;i<n.childNodes.length;i++) {
		c = n.childNodes[i];
		if (c.nodeType == 3) {
			v 		= c.nodeValue;
		} else if (c.nodeType == 1 && c.nodeName.toLowerCase() == "input") {
			v 		= c.value;
		} else {
			v		= null;
		}
		if (v !== null) {
			offset	= v.search(expr);
			if (offset >= 0) {
				x = {};
				x.offset	= offset;
				x.match 	= v.match(expr);
				x.node 		= c;
				result.push(x);
			}
		}
		result = result.concat(Document_Scan(c,expr));
	}
	return result;
}

function RandomString() {
	return (Math.random()+'').substring(2,10);
}

function noop() {
}

var gStyleSheetTitle = Cookie_Find('style', 'normal');

function Server_Message(uri)
{
	var i = new Image();
	var r = RandomString();
	var p = uri.lastIndexOf('?');
	if (p < 0) {
		uri += '?';
	} else {
		uri += '&';
	}
	i.src = uri + "r=" + r;
}


function Style_SetActive(title/*, saveIt */)
{
	var i, a, main;
	var saveIt = (arguments.length > 1) ? arguments[1] : true;
	for(i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
		if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
			a.disabled = true;
			if (a.getAttribute("title") == title) {
				a.disabled = false;
			}
		}
	}
	if (saveIt) {
		gStyleSheetTitle = title;
		setCookie('style', title);
	}
}

function Style_Refresh()
{
	var src;
	var i = document.images.style_change;
	if (i) {
		src = 'style_'+gStyleSheetTitle+'.gif';
		i.src = '/images/' + src;
	}
	Style_SetActive(gStyleSheetTitle, true);
}

function Style_Toggle()
{
	var a = arguments;
	var i;
	var c;

	if (a.length === 0) {
		a[0] = 'normal';
		a[1] = 'big';
	}
	c = 0;
	for (i = 0; i < a.length; i++) {
		if (a[i] == gStyleSheetTitle) {
			c = (i + 1) % a.length;
			break;
		}
	}
	gStyleSheetTitle = a[c];
	Style_Refresh();
}

function ObjectID_DisplayToggleState(f, id, fname)
{
	f[fname].value = ObjectID_DisplayToggle(id) ? "block" : "none";
	return false;
}


function AppendSection(to, contents)
{
	ObjectID_SetContents(to, ObjectID_Contents(to) + contents);
	return true;
}

function String_Catenate(delimiter /*, string1, string2 */)
{
	var i;
	var s;

	s = "";
	for (i = 1; i < arguments.length; i++) {
		if (arguments[i] !== "") {
			if (s !== "") {
				s += delimiter;
			}
			s += arguments[i];
		}
	}
	return s;
}

function URL_Valid(u, schemes)
{
	u = u.trim();
	if (u === "") {
		return true;
	}
	var s = schemes.toLowerCase().split(";");
	var n = s.length;
	var x = u.indexOf('://');
	if (x < 0) {
		alert('Please specify a URL containing "://", such as http://cr.to.');
		return false;
	}
	var scheme = u.substr(0,x).toLowerCase();
	for (var i = 0; i < n ; i++) {
		if (s[i] == scheme) {
			return true;
		}
	}
	alert('Please specify a URL that begins with ' + s.join(' or '));
	return false;
}

function Window_NormalizeNameFromURI(uri)
{
	var e = /[^A-Z0-9_]/gi;
	var r = uri.replace(e, "_");
	if (r === "") {
		r = 'default';
	}
	return r;
}

function Window_FormName(w)
{
	if ((typeof w.form.name != "undefined") && w.form.name !== "") {
		return w.form.name;
	}
	return w.form.id;
}

function Window_Open(theLink, width, height)
{
	var wparam = "resizable=yes,toolbar=no,menubar=no,scrollbars=yes,width=" + width + ",height=" + height;
	var name = Window_NormalizeNameFromURI(theLink);
	var newwin = window.open(theLink, name, wparam);
	if (newwin) {
		newwin.focus();
	}
	return newwin;
}

var gFormsPending = 0;
var gConfirmTime = new Date();
var gFormState = {};
var gLastAnswer = false;

function Control_Value(control)
{
	var def = arguments[1] || "";
	var value;
	if (!control) {
		return def;
	}
	if (control.type.substr(0,6) == "select") {
		return control.options[control.selectedIndex].value;
	} else if (control.type == "checkbox") {
		return control.checked;
	} else {
		value = control.value;
	}
	if ((value === "") || (value === null)) {
		return def;
	}
	return value;
}

function Control_HasValue(control)
{
	var v = Control_Value(control, false);
	if ((v === "") || (v === null)) {
		return false;
	}
	return true;
}

function Control_SelectText(control, def)
{
	if (!control) {
		return def;
	}
	if (control.type.substr(0,6) == "select") {
		return control.options[control.selectedIndex].text;
	}
	return def;
}

function Control_SetValue(control, value)
{
	if (!control) {
		alert("Control_SetValue(!control," + value + ")");
		return false;
	}
	if (control.type == "select") {
		var i;
		for (i = 0; i < control.options.length; i++) {
			if (control.options[i].value == value) {
				control.selectedIndex = i;
				return true;
			}
		}
		alert("Control_SetValue(" + form + ","+ name +"," + value + "): unable to find select value");
		return false;
	} else if (control.type == "checkbox") {
		control.checked = (value) ? true : false;
		return true;
	} else {
		if (control.value != value) {
			control.value = value;
		}
		return true;
	}
}

/*
This don't work, unless we alert between SetValue and submit
*/
function Control_SetValuePost(control, value)
{
	Control_SetValue(control, value);
	control.form.submit();
	return true;
}

function Control_Checked(control)
{
	if (control.type == "checkbox") {
		return control.checked;
	}
	return false;
}

function Form_SetChecked(form, name, value)
{
	var control;
	control = form.elements[name];
	if (!control) {
		return;
	}
	if (control.type == 'checkbox') {
		form.elements[name].checked = value;
	}
}

function Form_GetControl(form, name /*, func*/)
{
	var control;
	var func = "unspecified";
	if (arguments.length > 2)	{
		func = arguments[2];
	}
	control = form.elements[name];
	if (!control) {
		//		alert(func + "(" + form + ","+ name +"," + value + "): undefined");
		return false;
	}
	return control;
}
function Form_SetBackground(form, name, color)
{
	var control = Form_GetControl(form, name, "Form_SetEnabled");
	if (control) {
		control.style.backgroundColor = color;
	}
}

function Form_SetEnabled(form, name, value)
{
	var control = Form_GetControl(form, name, "Form_SetEnabled");
	if (control) {
		control.disabled = (value) ? false : true;
	}
}

function Form_GetEnabled(form, name)
{
	var control = Form_GetControl(form, name, "Form_SetEnabled");
	if (control) {
		return !control.disabled;
	}
	return false;
}

function Form_Value(form, name, def)
{
	var control;
	control = form.elements[name];
	if (!control || typeof control == "undefined") {
		return def;
	}
	return Control_Value(control, def);
}

function Form_SetValue(form, name, value)
{
	var control = form.elements[name];
	if (!control) {
		return false;
	}
	if (!Control_SetValue(control, value)) {
		return false;
	}
	return true;
}

function Form_SetEnabledLike(form, mixed, enabled)
{
	var e = form.elements;
	var i;
	if (typeof mixed == "object") {
		for (i = 0; i < mixed.length; i++) {
			Form_SetEnabledLike(form, mixed[i], enabled);
		}
	} else {
		for (i = 0; i < e.length; i++) {
			if (e[i].name.indexOf(mixed) >= 0) {
				e[i].disabled = enabled ? false : true;
			}
		}
	}
}

function Control_ClearFocus(w, value)
{
	if (w.value == value) {
		w.value = '';
	}
}

function Control_ResetFocus(w, value)
{
	if (w.value === '') {
		w.value = value;
	}
}

function clink(w)
{
	if (gFormsPending === 0) {
		return true;
	}
	var fname = false;
	if (typeof w == 'object') {
		fname = w.name;
	}
	var n, message='';
	gFormsPending = 0;

	for (n in gFormState) {
		if (gFormState.hasOwnProperty(n)) {
			if (gFormState[n].changed) {
				if (n != fname) {
					message += gFormState[n].message + "\n";
				}
				gFormsPending++;
			}
		}
	}
	if (message !== "") {
		var newTime = new Date();
		var delta = newTime.getTime() - gConfirmTime.getTime();
		//		alert(newTime.getTime() + " - " + gConfirmTime.getTime() + " = " + delta);
		if (delta < 2000) {
			return gLastAnswer;
		}
		gConfirmTime = new Date();
		gLastAnswer = confirm(message);
		return gLastAnswer;
	}
	return true;
}

function clinkhref(x)
{
	if (gFormsPending === 0) {
		return true;
	}
	if (clink(null)) {
		document.location = x;
		return true;
	}
	return false;
}

function Form_Register(form, message)
{
	gFormState[form.name] = {};
	gFormState[form.name].message = message;
	gFormState[form.name].changed = 0;
}

function Form_Cancel(form)
{
	form.reset();
	gFormState[form.name].changed = 0;
}

function Form_CancelAll()
{
	for (var i in gFormState) {
		if (gFormState.hasOwnProperty(i)) {
			Form_Cancel(document.forms[i]);
		}
	}
}

function ichanged(w)
{
	if (typeof gFormState[w.form.name] != "undefined") {
		gFormState[w.form.name].changed = 1;
		++gFormsPending;
	}
}

var gCallback = {};

function callback(o, func)
{
	o.to = setTimeout(func + "(" + o.n + ")", o.nMS);
}

function textarea_resizer(fname, ename, xpad, ypad)
{
	var e = document.forms[fname].elements[ename];

	this.xpad	= xpad;
	this.ypad	= ypad;

	this.ww		= Window_Width();
	this.wh		= Window_Height();

	this.e		= e;
	this.dx		= - Object_GetWidth(e);
	this.dy		= - Object_GetHeight(e);
	this.n		= gCallback.length;
	this.nMS	= 10;

	e.cols += 10;
	e.rows += 10;

	callback(this, "ta_test");

	gCallback[this.n] = this;
}

function ta_test(n)
{
	if (typeof Window_Height == "undefined") {
		callback(this, "ta_test");
	} else {
		var o = gCallback[n];
		var e = o.e;

		o.dx = (o.dx + Object_GetWidth(e)) / 10.0;
		o.dy = (o.dy + Object_GetHeight(e)) / 10.0;

		gCallback[n] = o;

		callback(this, "ta_resize");
	}
}

function ta_resize(n)
{
	var o = gCallback[n];
	var e = o.e;

	if (typeof e.cols == "undefined")
	{
		o.nMS = 1000;
		callback(this, "ta_resize");
		return;
	}

	var	ww = Window_Width();
	var wh = Window_Height();

	e.cols = Math.max(parseInt((ww - o.xpad) / o.dx, 10),10);
	e.rows = Math.max(parseInt((wh - o.ypad) / o.dy, 10),10);

	o.nMS = 10;
	callback(this, "ta_resize");
}



/*********** Lists *******************/

function ListControl_CountChecked(form, prefix, value)
{
	var i 		= form.elements.length;
	var n		= 0;
	var name	= prefix + "[]";
	var nlen	= name.length;
	if (Form_Value(form, prefix + "CheckAll", false)) {
		return -1;
	}
	while (i-- !== 0) {
		if ((form.elements[i].type == "checkbox") &&
		(form.elements[i].name.substring(0,nlen) == name) &&
		(form.elements[i].checked == value)) {
			++n;
		}
	}
	return n;
}

function ListControl_SetChecked(form, prefix, value)
{
	var i		= form.elements.length;
	var nlen	= prefix.length;
	while (i-- !== 0) {
		if (form.elements[i].name.substring(0,nlen) == prefix) {
			form.elements[i].checked = value;
		}
	}
}

function ListControl_CheckPage(control, prefix)
{
	var form	= control.form;
	var value	= Control_Value(control, false);

	ListControl_SetChecked(form, prefix + "[]", value);
	Form_SetChecked(form, prefix + "CheckAll", false);
}

function ListControl_CheckItem(control, prefix)
{
	var form	= control.form;
	var value	= Control_Value(control, false);
	if (value === false) {
		Form_SetChecked(form, prefix + "CheckAll", false);
	} else if (ListControl_CountChecked(form, prefix, false) === 0) {
		Form_SetChecked(form, prefix + "CheckAll", true);
	}
}

function ListControl_CheckAll(control, prefix)
{
	var form	= control.form;
	var value	= Control_Value(control, false);

	if (value || (ListControl_CountChecked(form, prefix, false) === 0)) {
		ListControl_SetChecked(form, prefix + "[]", value);
	}
}

function ListControl_Action(control, name, promptPrefix, promptSuffix, confirmPrefix, confirmSuffix)
{
	var form = control.form;

	var id = Control_Value(control, false);
	if (id === false) {
		return false;
	}
	if (id == "new") {
		var promptString = String_Catenate(" ", promptPrefix, name, promptSuffix);
		nn = window.prompt(promptString);
		if (nn === null || nn === "null" || nn === "") {
			return false;
		} else {
			control.selectedIndex = 0;
			Form_SetValue(form, control.name + "New", nn);
			form.submit();
			return true;
		}
	} else {
		var message = String_Catenate(" ", confirmPrefix, name, confirmSuffix);
		if (confirm(message)) {
			form.submit();
			return true;
		}
	}
	return false;
}

function ListControl_ConfirmAction(button, prefix, action, object_name)
{
	var form = button.form;
	var m;
	var n;
	object_name = ((object_name || 'item') + "").trim();
	object_name = object_name || "item";
	var n = ListControl_CountChecked(form, prefix, true);
	var verb = ("ListAction::" + action)._T();
	if (n === 0) {
		m = 'ListAction::You need to select at least one {0} to {1}.'._T();
		m = m._T()._M(object_name, verb);
		message(m);
		return false;
	}
	m = 'Are you sure you want to delete {0}?'._T()._M(these(object_name, n));
	if (confirm(m)) {
		form.submit();
		return true;
	} else {
		return false;
	}
}

/******************************************************************************************\
*
* Query String manipulation
*
\******************************************************************************************/

function QS_parse()
{
	var qs = arguments[0] ? arguments[0] : document.search;
	var pos;
	if ((pos = qs.indexOf('?')) >= 0) {
		qs = qs.substring(pos + 1);
	}
	var q = qs.split('&');
	var r = {};
	var p;
	for (var i = 0; i < q.length; i++) {
		p = q[i].split('=',2);
		r[p[0]] = (p.length == 2) ? p[1] : true;
	}
	return r;
}

function QS_format(url, q_add/*, q_remove=false */)
{
	var k;
	var qs = QS_parse(url);
	if (typeof q_add == "string") { q_add = QS_parse(q_add); }
	var q_remove = arguments[2] || "";
	if (typeof q_remove == "string") { q_remove = q_remove.split(";"); }
	if (typeof q_remove == "array") { q_remove = q_remove.join(";"); }
	q_remove = ";" + q_remove + ';';
	var sep = "?";
	if ((k = url.indexOf('?')) >= 0) {
		url = url.substring(0,k);
	}
	for (k in qs) {
		if (qs.hasOwnProperty(k)) {
			if (typeof q_add[k] != _ud) {
				continue;
			}
			url = url + sep + k + "=" + escape(qs[k]);
			sep = "&";
		}
	}
	for (k in q_add) {
		if (q_add.hasOwnProperty(k)) {
			if (q_remove.indexOf(';' + k + ';') >= 0) {
				continue;
			}
			url = url + sep + k + "=" + escape(q_add[k]);
			sep = "&";
		}
	}
	return url;
}

function QS_get(n)
{
	var d = arguments.length > 1 ? arguments[1] : null;
	var q = location.search;
	if (q.substring(0,1) == "?") {
		q = q.substring(1);
	}
	q = q.split("&");
	var p;
	n = n.toLowerCase();
	for (var i = 0; i < q.length; i++) {
		p = q[i].split("=",2);
		if (p.length == 2 && p[0].toLowerCase() == n) {
			return unescape(p[1]);
		}
	}
	return d;
}

/******************************************************************************************\
*
* prototype.js related stuff here
*
\******************************************************************************************/
var ajax_finish = {};

function toggle(id)
{
	var e = new Effect[Element.visible(id) ? 'BlindUp' : 'BlindDown'](id, {duration: 0.25});
}

function ajax_edit(id, uri)
{
	if (Element.empty(id)) {
		var x = new Ajax.Updater(id, uri, {
			method:     'get',
			onFailure:  function() {Element.classNames(id).add('error');},
			onComplete: function() {var e = new Effect.BlindDown(id, {duration: 0.25});}
		});
	} else {
		toggle(id);
	}
	if (arguments.length >= 3) {
		if (typeof arguments[2] == "function") {
			ajax_finish[id] = arguments[2];
		}
	}
}

function ajax_form_cancel(id)
{
	var delay = arguments.length > 1 ? arguments[1] : 0;
	var e = new Effect.Fade(id, {duration: 1, delay: delay, afterFinish: function() { $(id).innerHTML = ""; }});
	ajax_finish[id] = false;
}

function ajax_set_content(id, content)
{
	id = $(id);
	id.innerHTML = content;
}

function ajax_form_finish(id, message)
{
	if (message.length > 0) {
		ajax_set_content(id, '<div class="message">' + message + '</div>');
	}
	var finish_function = ajax_finish[id];
	ajax_finish[id] = null;
	ajax_form_cancel(id, 3);
	if (typeof finish_function == "function") {
		finish_function();
	}
}

function ajax_form_handle_result(id)
{
	var content = $(id).innerHTML;
	if (content.indexOf("*success*") > 0) {
		ajax_form_finish(id, '');
	}
}

function form_disable(form_id)
{
	var form;
	if (typeof form_id == "object") {
		form = form_id;
	} else {
		form = document.forms[form_id];
	}
	for (i = 0; i < form.elements.length; i++) {
		form.elements[i].disabled = true;
	}
}

function ajax_form_serialize(form)
{
	var elements = Form.getElements($(form));
	var queryComponents = [];
	for (var i = 0; i < elements.length; i++) {
		if (elements[i].type == 'button') {
			continue;
		}
		var queryComponent = Form.Element.serialize(elements[i]);
		if (queryComponent) {
			queryComponents.push(queryComponent);
		}
	}
	return queryComponents.join('&');
}

function ajax_form_submit(widget, id, uri/*, finish_fuction*/)
{
	var qs = ajax_form_serialize(widget.form) + "&OK=1&embed=1&ajax_id=" + id;
	form_disable(widget.form);
	if (typeof arguments[3] == "function") {
		ajax_finish[id] = arguments[3];
	}
	var x = new Ajax.Updater(id, uri, {
		method:		'post',
		postBody:	qs,
		onFailure:	function()	{alert("A problem occurred");},
		onComplete:	function()	{ajax_form_handle_result(id);}
	});
}

function ajax_form_continue(form,id)
{
	var form_name = form;
	form = $(form);
	var uri = form.action;
	if (form_name == "ajax_main_form") {
		form.action = form.action + ((form.action.indexOf("?") < 0) ? "?" : "&") + "_continue=1";
		form.submit();
		return true;
	}
	var qs = ajax_form_serialize(form) + "&embed=2&_continue=1&ajax_id="+id;
	form_disable(form);
	var x = new Ajax.Updater(id, uri, {
		method:		'post',
		postBody:	qs,
		onFailure:	function()	{alert("A problem occurred");},
		onComplete:	function()	{}
	});
}

function toggle_edit(id)
{
	//	new Effect[Element.visible(id + "_edit") ? "SlideUp" : "SlideDown"](id + "_edit",{duration:0.5});
	$('#'+id+'_edit').slideToggle();
}

function slide_toggle(id)
{
	//	new Effect[Element.visible(id) ? "SlideUp" : "SlideDown"](id,{duration:0.5});
	$('#'+id).slideToggle();
}


function html_control_append(id, content)
{
	var new_div = document.createElement('div');
	new_div.innerHTML = content;
	$(id).parentNode.appendChild(new_div);
}

function image_share_change(id, new_src)
{
	var src = $(id).attr('src');
	var pos = src.indexOf('/share/');
	src = src.substr(0,pos) + new_src;
	$(id).attr('src',src);
}

function arrow_down_right_all(v)
{
	if (v) {
		$('.toggle-arrow-content').show();
		$('div.toggle-arrow a.toggle-arrow img').each(function(k,v) { image_share_change(v, '/share/images/toggle/small-down.gif'); });
	} else {
		$('.toggle-arrow-content').hide();
		$('div.toggle-arrow a.toggle-arrow img').each(function(k,v) { image_share_change(v, '/share/images/toggle/small-right.gif'); });
	}
}


function list_dhtml_extract(w,id)
{
	var f = w.form;
	var find = '['+id+']';
	var qs = '';
	for (var i = 0; i < f.elements.length; i++) {
		var e = f.elements[i];
		if (e.name.substring(e.name.length-find.length) == find) {
			qs += (qs ? '&' : '') + e.name.substring(0,e.name.length-find.length) + '=' + escape(Control_Value(e));
		}
	}
	return qs;
}

function list_dhtml_save(w, id)
{
	w.value = "Saving...";
	w.disabled = true;
	var x = new Ajax.Updater('list-message-'+id,'edit.php?ID='+id+'&'+list_dhtml_extract(w,id)+'&ajax_list=1',{
		onComplete: function () {
			w.disabled = false;
			w.value = "Save";
			var e = new Effect.Fade('list-message-'+id,{delay:2,duration:1});
		}
	});
}


function list_dhtml_delete(w, id)
{
	if (!confirm('Are you sure you want to delete?')) {
		return false;
	}
	w.value = "Deleting ...";
	w.disabled = true;
	var x = new Ajax.Updater('list-message-'+id,'edit.php?ID='+id+'&'+list_dhtml_extract(w,id)+'&action=delete&ajax_list=1',{
		onComplete: function () {
			w.disabled = true;
			w.value = "Deleted!";
			var e = new Effect.Fade('list-row-'+id,{delay:0.2,duration:1});
		}
	});
}

function QueryParameter(name/*, default */)
{
	var s = document.location.search;
	var def = (arguments.length > 1) ? arguments[1] : false;
	if (s.substr(0,1) == '?') {
		s = s.substr(1);
	}
	var x = s.split('&'), i, nv;
	for (i=0;i<x.length;i++) {
		nv = x[i].split('=');
		if (nv[0].toLowerCase() == name) {
			if (nv.length == 1) {
				return true;
			}
			return unescape(nv[1]);
		}
	}
	return def;
}

function hide_id(id)
{
	Element.hide(id);
}

function closebox_fade(area,indelay,induration)
{
	return new Effect.SlideUp(area,{delay:indelay,duration:induration});
}

/******************************************************************************************\
*
* jquery.js related stuff here
*
\******************************************************************************************/
function message(m) {
	$('#message-container').hide();
	$('#message-container .message').html(m);
	$('#message-container').fadeIn();
	setTimeout('$(\'#message-container\').fadeOut();', 5000);
	$('#message-container').click(function() { $(this).fadeOut('fast'); });
}

function pager_limit_change(ajax_id)
{
	$.get('?'+$(":input", this.form).serialize(),function(data){$('#' + ajax_id).html(data);});
}

function arrow_down_right_jquery(id)
{
	var state_url = arguments[1] || false;
	var is_vis = $('#'+id).is(":visible");
	$('#'+id).slideToggle(500, function() { image_share_change('#' + id + "_img", "/share/images/toggle/small-" + (is_vis ? "right" : "down") + ".gif"); });
	if (state_url) {
		state_url = state_url.replace(/\{value\}/,is_vis ? 'false' : 'true');
		$.get(state_url);
	}
	if (!state_url) {
		if (!is_vis) {
			document.location = "#" + id;
		} else {
			document.location = "#";
		}
	}
}

function ellipsis_toggle(n)
{
	$('#ellipsis-'+n).toggle();
	$('#ellipsis-'+n+'-all').toggle();
}

function ajax_jquery_form_cancel(id, func)
{
	$('#'+id).slideUp(500,function() { if (func) { func(); } });
}

function ajax_jquery_form_submit(id, func)
{
	//	var data = $('#'+id+' form').serialize();
	var uri = $('#'+id+ ' form').attr('action');
	var data = {};
	//var debug = "";
	$('#'+id+ ' form :input:not(:button)').each(
	function () {
		data[$(this).attr('name')] = $(this).val();
		//debug += $(this).attr('name') + "=" + $(this).val() + "\n";
	}
	);
	//alert(debug);
	$.post(uri, data, func || null);
}

if (!window.console) {
	var console = {};
	console.log = function (x) {};
}

function cdn_prefix()
{
	if (arguments[0]) { window._cdn_prefix = arguments[0]; }
	return window._cdn_prefix ? window._cdn_prefix : "";
}

function arrow_down_right(id)
{
	var state_url = arguments[1] || false;
	if (typeof Prototype == "undefined") {
		arrow_down_right_jquery(id,state_url);
	} else {
		var is_vis = Element.visible(id);
		if (false) {
			if (is_vis) { $(id).hide(); } else { $(id).show(); }
			image_share_change(id + "_img", (is_vis) ? "/share/images/toggle/small-right.gif" : "/share/images/toggle/small-down.gif");
		} else {
			var args = arguments[1] || {duration: 0.25};
			if (is_vis) {
				args.afterFinish = function () { image_share_change(id + "_img", "/share/images/toggle/small-right.gif"); };
			} else {
				args.afterFinish = function () { image_share_change(id + "_img", "/share/images/toggle/small-down.gif"); };
			}
			var e = new Effect[is_vis ? 'BlindUp' : 'BlindDown'](id, args);
		}
		state_url = state_url.replace(/\{value\}/,is_vis ? 'false' : 'true');
		var x = new Ajax.Updater(state_url);
	}

}

function arrow_down_right_load(iid, url)
{
	var id = iid;
	if ($('#'+id).html() === "") {
		$.get(url, function (html) { $('#'+id).html(html); arrow_down_right(id); });
	} else {
		arrow_down_right(id);
	}
}
function ControlSelectObjectDynamic_KeyDown(e)
{
	if (e.keyCode === 13) {
		alert($(e).serialize());
	}
}

function ControlSelectObjectDynamic_Update(name, url)
{
	var id = name;
	var form = $('#' + id + '_widget :input');
	form = form[0].form;
	var data = $(":input", form).serialize();
	var p = '#' + id + '_widget';
	p = p + ' ';
	var query = $(p+'.csod-input input').val();
	if (query == "") {
		return;
	}
	url += (url.indexOf('?') < 0 ? '?' : '&') + data;
	$(p+'.csod-wait').show();
	$.getJSON(url, function (data) {
		$(p+'.csod-wait').hide();
		if (typeof data == "object") {
			var options = "";
			for (var k in data) {
				options = options + '<option value=\"' + k + '\">' + data[k] + '</option>';
			}
			$(p+'.csod-input').hide();
			$(p+'.csod-search').hide();
			$(p+'.csod-select').html('<select name=\"'+id+'\">' + options + '</select>');
			$(p+'.csod-message').hide('slow');
			$(p+'.csod-select').show();
		} else {
			if (""+data == "0") {
				$(p+'.csod-message-no span.query').html(query);
				$(p+'.csod-message-no').show('slow');
				$(p+'.csod-message').hide('slow');
			} else {
				$(p+'.csod-message span.count').html(data);
				$(p+'.csod-message').show('slow');
				$(p+'.csod-message-no').hide('slow');
			}
		}
	});
}

function ControlSelectObjectDynamic_Reset(id)
{
	var p = '#' + id + '_widget ';
	$(p+'.csod-input input').val('');
	$(p+'.csod-select').html('<input name=\"'+id+'\" value="" type="hidden" />');
	$(p+'.csod-none').hide();
	$(p+'.csod-some').show();
	$(p+'.csod-input input').blur();
}
