// ================================================================================
// ojo/
// ================================================================================

function addEvent( obj, type, fn ) { 
	if ( obj.attachEvent ) { 
		obj['e'+type+fn] = fn; 
		obj[type+fn] = function(){obj['e'+type+fn]( window.event );} 
		obj.attachEvent( 'on'+type, obj[type+fn] ); 
	} else {
		obj.addEventListener( type, fn, false ); 
	}
} 

function removeEvent( obj, type, fn ) { 
	if ( obj.detachEvent ) { 
		obj.detachEvent( 'on'+type, obj[type+fn] ); 
		obj[type+fn] = null; 
	} else {
		obj.removeEventListener( type, fn, false ); 
	}
} 


function jsHttpRequest() {
	function initConnector() {
		var o = null;
		var success = false;
		var MSXML_XMLHTTP_PROGIDS = new Array(
			'MSXML2.XMLHTTP.5.0',
			'MSXML2.XMLHTTP.4.0',
			'MSXML2.XMLHTTP.3.0',
			'MSXML2.XMLHTTP',
			'Microsoft.XMLHTTP'
		);

		for (var i=0;i < MSXML_XMLHTTP_PROGIDS.length && !success; i++) {
			try {
				o = new ActiveXObject(MSXML_XMLHTTP_PROGIDS[i]);
				success = true;
			} catch (e) {}
		}
		if( null==o && typeof XMLHttpRequest != "undefined") o = new XMLHttpRequest();
		return o;
	} this.initConnector = initConnector;


	function doRequest(method,url,parms) {
			var ret = false;
			var x = this.initConnector();
			if(null==x)  return;
			var self = this;

			var i, n;
			var post_data;
			method = method.toUpperCase();

			if (method == "GET") { 
				if (url.indexOf("?") == -1) url += "?";
				for( var qparam in parms) { url += qparam+"="+escape(parms[qparam])+"&"; }
				var dt = new Date();
				url += '_'+dt.getTime()+'=1';
				post_data = null;
			} else {
				post_data = "&";
				for( var qparam in parms) { post_data += qparam+"="+escape(parms[qparam]); }
				if(2<post_data.length) post_data = post_data.substr(1);
				else post_data = "";
			}
			x.onreadystatechange = function() {
				if (x.readyState != 4) return;
				if( x.status == 200) {
					self.owner.actionResponse = ('xml'==self.owner.actionResponseType.toLowerCase()?x.responseXML:x.responseText);
					self.owner.action();
				} else {
					alert(x.status);
				}
			}

			try {
				x.open(method, url, true);
				if (method == "POST") {
					x.setRequestHeader("Method", "POST " + url + " HTTP/1.1");
					x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				}
				x.send(post_data);
				ret = true;
			} catch (e) {
				alert(e);
			}
			delete x;
			return ret;

	} this.doRequest = doRequest;


	this.owner = arguments[0];
}

function toUpperCase127(input) { 
	var lower = "aàâäbcçdeéèêëfghiîïjklmnoôöpqrstuùûvwxyz" 
	var upper = "AAAABCCDEEEEEFGHIIIJKLMNOOOPQRSTUUUVWXYZ" 
	var output = ""; 
	var car;
	for (var i = 0 ; i < input.length ; i++) { 
	  car = input.substr(i, 1); 
	  output += (lower.indexOf(car) != -1) ? upper.substr(lower.indexOf(car), 1) : car; 
	} 
	return output; 
} 



function trim(str) {
	var mode = (2==arguments.length?arguments[1].toUpperCase():'LR');
	var trimLen = 0;
	if( mode.indexOf('L')>-1 ) {
		for(var i=0;i<str.length;i++) { 
			if( /\s/.test(str.substr(i,1)) ) trimLen++; 
			else break;
		}
		if(trimLen>0) str = str.substr(trimLen);
		trimLen = 0;
	}
	if( mode.indexOf('R')>-1 ) {
		for( i=str.length-1;i>=0;i--) { 
			if( /\s/.test(str.substr(i,1)) ) trimLen++; 
			else break;
		}
		if(trimLen>0) str = str.substr(0,str.length-trimLen);
	}
	return str;
}

function setJsCookie(key,value,expires) {
	var gmtExpire;
	if( typeof expires == 'object') {
		gmtExpire = '; expires=' + expires.toGMTString() + ';';
	} else {
		gmtExpire = ';';
	}
	document.cookie = key + '=' + escape(value) + gmtExpire;
}

function checkMailAddr(value) {
	var addr = value.split("@");
	if(addr.length==1 || addr.length>2) return false;
	var dom = addr[1].split(".");
	if(dom.length == 1) return false;
	var domLen = dom.length
	if(domLen>2 && (dom[domLen-1]).length==0) domLen--;
	if(dom[domLen-1].length<2 || dom[domLen-1].length>3) return false;
	for(var i=0;i<domLen;i++) { if(dom[i].length==0) return false; }

	var acc = addr[0].split(".");
	for(i=0;i<acc.length;i++) { if(acc[i].length==0) return false; }
	var okChars = "abcdefghijklmnopqrstuvwxyz";
	okChars += okChars.toUpperCase()+"0123456789-_";
	var testString = acc.join("")+"."+dom.join("");
	if("."==testString) return false;
	i=0;
	while( i<testString.length ) { 
		if('.'==testString.substr(i,1)) {
			okChars = okChars.substr(0,okChars.length-1);
		} else {
			if(okChars.indexOf(testString.substr(i,1))==-1 ) return false;
		}
		i++;
	}
	return true;
}


function SetCookie(cookieName,cookieValue,nDays) {
 var today = new Date();
 var expire = new Date();
 if (nDays==null || nDays==0) nDays=1;
 expire.setTime(today.getTime() + 3600000*24*nDays);
 document.cookie = cookieName+"="+escape(cookieValue)
                 + "; expires="+expire.toGMTString();
}

function SetSessCookie(cookieName,cookieValue) {
	document.cookie = cookieName+"="+escape(cookieValue);
}

function getCookie(cookieName) {
	var ret = undefined;
	var toks = document.cookie.split(";");
	for( var i=0; i<toks.length; i++) {
		toks[i] = toks[i].replace(/^\s*/,"");
		if( 0==toks[i].indexOf(cookieName+"=") ) {
			ret = unescape(toks[i].substr(toks[i].indexOf("=")+1));
			break;
		}
	}
	return ret;
}



// XOR decode
function usr_str_xor(pStr,pKey) {
	var cs = pStr.length;
	var ck = pKey.length;
	var ret="";
	for(i=0;i<cs;i++) { ret += String.fromCharCode(pKey.charCodeAt(i%ck)^pStr.charCodeAt(i)); }
	return ret
}

// Base64 encoding
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

function base64encode(str) {
    var out, i, len;
    var c1, c2, c3;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
	c1 = str.charCodeAt(i++) & 0xff;
	if(i == len)
	{
	    out += base64EncodeChars.charAt(c1 >> 2);
	    out += base64EncodeChars.charAt((c1 & 0x3) << 4);
	    out += "==";
	    break;
	}
	c2 = str.charCodeAt(i++);
	if(i == len)
	{
	    out += base64EncodeChars.charAt(c1 >> 2);
	    out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
	    out += base64EncodeChars.charAt((c2 & 0xF) << 2);
	    out += "=";
	    break;
	}
	c3 = str.charCodeAt(i++);
	out += base64EncodeChars.charAt(c1 >> 2);
	out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
	out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
	out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
}

function base64decode(str) {
    var c1, c2, c3, c4;
    var i, len, out;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
	/* c1 */
	do {
	    c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
	} while(i < len && c1 == -1);
	if(c1 == -1)
	    break;

	/* c2 */
	do {
	    c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
	} while(i < len && c2 == -1);
	if(c2 == -1)
	    break;

	out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));

	/* c3 */
	do {
	    c3 = str.charCodeAt(i++) & 0xff;
	    if(c3 == 61)
		return out;
	    c3 = base64DecodeChars[c3];
	} while(i < len && c3 == -1);
	if(c3 == -1)
	    break;

	out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));

	/* c4 */
	do {
	    c4 = str.charCodeAt(i++) & 0xff;
	    if(c4 == 61)
		return out;
	    c4 = base64DecodeChars[c4];
	} while(i < len && c4 == -1);
	if(c4 == -1)
	    break;
	out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
}
// Base64 encoding ==


// UI ================================================

function getEventAbsPos(evt) {
	var p = new Object();
	p.x = evt.pageX?evt.pageX:evt.x+document.body.scrollLeft;
	p.y = evt.pageY?evt.pageY:evt.y+document.body.scrollTop;
	return p;
}

function handleFrDateInputting(evt,el) {
	var bounds;
	if( evt.shiftKey )  bounds = new Array(48,57,191);
	else   bounds = new Array(96,105,111);
	var directions = new Array(35,40);

	if( bounds[2]!=evt.keyCode ) {
		if(evt.keyCode<bounds[0] || evt.keyCode>bounds[1] ) {
			if( 8==evt.keyCode || (evt.keyCode>=directions[0] || evt.keyCode<=directions[1]) ) return;
			el.value = el.value.substr(0,el.value.length-1);
			return;
		}
	}
	if( 2==el.value.length || 5==el.value.length ) el.value += "/";
	el.value = el.value.replace("//","/");
}

// UI ==




//
// Globals ========================================================================
//

var ImgExts = new String("|gif|jpg|jpe|jpeg|png|bmp|wbmp|tif|tiff|pcx|psd|emf|raw|tga|");


//
// ================================================================================
