/*################################*/
/*############  ajax  ############*/
/*################################*/
function AjaxCall(servletURL, parameters, callback, userData)
{
    /********/
    /* Data */
    /********/
    var ajax;
    var asynchronous = true;

    /***************/
    /* Constructor */
    /***************/
    ajax = ajaxNew();
    ajax.onreadystatechange = processRequest;

    /***********/
    /* Methods */
    /***********/
    function processRequest()
    {
        if(ajax.readyState == 4) {
            if((ajax.status == 200)||(ajax.status == 0)) {
                if(callback != null) callback(ajax.responseText, ajax.readyState, userData);
            }else {
                alert("Error de AJAX");
            }
        }else {
            // If readyState is not 4, responseText is not yet set and should not be used
            if(callback != null) callback("", ajax.readyState, userData);
        }
    }

    this.doGET = function()
    {
        ajax.open("GET", servletURL+"?"+encodeURI(parameters), asynchronous);
        ajax.send(null);
    }

    this.doPOST = function()
    {
        ajax.open("POST", servletURL, asynchronous);
        ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        ajax.setRequestHeader("Content-length", parameters.length);
        ajax.setRequestHeader("Connection", "close");
        ajax.send(parameters);
    }

    function ajaxNew()
    {
        var xmlHttp = false;

        if(window.XMLHttpRequest) {                     // Opera, Firefox, Safari
            xmlHttp = new XMLHttpRequest();
        }else if(window.ActiveXObject) {                // Internet Explorer Browsers (Yuck!)
            try{
                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
            }catch(e) {
                try {
                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                }catch(E) {
                    xmlHttp = false;
                }
            }
        }
        return xmlHttp;
    }
}
/*################################*/
/*###########  general  ##########*/
/*################################*/

/* Utilities */
function getElementTop(elem)
{
	var curtop = 0;
	if(elem.offsetParent) {
		do {
			curtop += elem.offsetTop;
		}while(elem = elem.offsetParent);
	}else {
		return 150;
	}
	return curtop;
}

function getElementLeft(elem)
{
	var curleft = 0;
	if(elem.offsetParent) {
		do {
			curleft += elem.offsetLeft;
		}while(elem = elem.offsetParent);
	}else {
		return 150;
	}
	return curleft;
}

function scrollToElement(elem, offset, smoothness)
{
	/* Defaults */
	if(!offset) offset = 0;
	if(!smoothness) smoothness = 5;

	var curScrollTop = document.documentElement.scrollTop;
	var diff = (getElementTop(elem)+offset) - document.documentElement.scrollTop;
	if(diff != 0) {
		document.documentElement.scrollTop += diff/smoothness;
		if(document.documentElement.scrollTop != curScrollTop) {	// Check if the bottom of the screen was reached
			scrollToElement(elem, offset, smoothness);
		}
	}
}

function changeZone(newZone, curZone)
{
	var newZone = newZone;
	var url = document.location.href;
	var regexp = new RegExp('http:\/\/(.[^/]+)'+config.root+'\/(.+)', 'i');
	if(curZone == "") {
		var url = url.match(regexp);
		var domain = url[1];
		var path = url[2];
		document.location.href = "http://"+domain+config.root+"/"+newZone+"/"+path;		
	}else {
		if(newZone == ""){
			var regexp = new RegExp("\/"+curZone+"\/", 'i');
			document.location.href = url.replace(regexp, "/");		
		}else {
			var regexp = new RegExp("\/"+curZone+"\/", 'i');
			document.location.href = url.replace(regexp, "/"+newZone+"/");
		}
	}
}

function printFrame(frameName)
{
	window.frames[frameName].focus();
	window.frames[frameName].print();
}

//function expand(control, divID)
//{
//	document.getElementById(divID).style.display = 'block';
//	control.innerHTML = "<img src='"+config.resHost+"/media/webart/collapse.gif?"+config.hash+"'>";
//	control.onclick = function(){collapse(this, divID);};
//}

//function collapse(control, divID)
//{
//	document.getElementById(divID).style.display = 'none';
//	control.innerHTML = "<img src='"+config.resHost+"/media/webart/expand.gif?"+config.hash+"'>";
//	control.onclick = function(){expand(this, divID);};
//}

function limitTextarea(textarea, maxlen)
{
	if(textarea.value.length > maxlen) {
		textarea.value = textarea.value.substring(0, maxlen);
	}
	if(textarea.form!=null) {
		if(textarea.form.remaining!=null) textarea.form.remaining.value = maxlen - parseInt(textarea.value.length);
	} 
}

function popupWindow(url,name,W,H)
{
	if (!name) name = "default";

	if (!H) heightVar = 400;
	else if (H < 1) heightVar = 1;
	else heightVar = H;

	if (!W) widthVar = 400;
	else if (W < 1) widthVar = 1;
	else widthVar = W;

	Xpos = (screen.width / 2);
	Ypos = (screen.height / 2);

	Xwin = widthVar / 2;
	Ywin = heightVar / 2;

	X = Xpos - Xwin;
	Y = Ypos - Ywin - 50;

	newWin = window.open(url,name,"width="+widthVar+",height="+heightVar+",top="+Y+",left="+X+",location=0,resizable=0,status=1,titlebar=1,directories=0,toolbar=0,menubar=0,scrollbars=1");
	newWin.focus();
//	onscreen = true;
}

function addEvent(obj, evType, fn)
{ 
	if(obj.addEventListener) { 
		obj.addEventListener(evType, fn, false); 
		return true; 
	}else if (obj.attachEvent){ 
		var r = obj.attachEvent("on"+evType, fn); 
		return r; 
	}else { 
		return false; 
	} 
}

function serialize(mixed_value)
{
    // http://kevin.vanzonneveld.net
    // +   original by: Arpad Ray (mailto:arpad@php.net)
    // +   improved by: Dino
    // +   bugfixed by: Andrej Pavlovic
    // +   bugfixed by: Garagoth
    // +      input by: DtTvB (http://dt.in.th/2008-09-16.string-length-in-bytes.html)
    // +   bugfixed by: Russell Walker
    // %          note: We feel the main purpose of this function should be to ease the transport of data between php & js
    // %          note: Aiming for PHP-compatibility, we have to translate objects to arrays
 
    var _getType = function( inp ) {
        var type = typeof inp, match;
        var key;
        if (type == 'object' && !inp) {
            return 'null';
        }
        if (type == "object") {
            if (!inp.constructor) {
                return 'object';
            }
            var cons = inp.constructor.toString();
            match = cons.match(/(\w+)\(/);
            if (match) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };
    var type = _getType(mixed_value);
    var val, ktype = '';
    
    switch (type) {
        case "function": 
            val = ""; 
            break;
        case "undefined":
            val = "N";
            break;
        case "boolean":
            val = "b:" + (mixed_value ? "1" : "0");
            break;
        case "number":
            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
            break;
        case "string":
            val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').length + ":\"" + mixed_value + "\"";
            break;
        case "array":
        case "object":
            val = "a";
            var count = 0;
            var vals = "";
            var okey;
            var key;
            for (key in mixed_value) {
                ktype = _getType(mixed_value[key]);
                if (ktype == "function") { 
                    continue; 
                }
                
                okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
                vals += serialize(okey) +
                        serialize(mixed_value[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
    }
    if (type != "object" && type != "array") {
        val += ";";
    }
    return val;
}

/* Validation */
function validateRequired(element, fieldName)
{
	if(!element) {
		alert("Error de validación.");
		return false;
	}

	element.value = element.value.replace(/^\s+|\s+$/g, ""); // Trim value

	switch(element.tagName) {
		case "INPUT":
		case "TEXTAREA":
			if(element.value == "" || element.value == null) {
				alert("Disculpe, debe especificar un "+fieldName+".");
				element.select();
				scrollToElement(element, -30);
				return false;
			}
			break;
		case "SPAN":
			if(element.innerHTML == "" || element.innerHTML == null) {
				alert("Disculpe, debe especificar un "+fieldName+".");
				scrollToElement(element, -30);
				return false;
			}
			break;
		case "SELECT":
			if( element.options[element.selectedIndex].value == "-1" 		||
				element.options[element.selectedIndex].value == null 		||
				element.options[element.selectedIndex].value == "undefined" ||
				element.options[element.selectedIndex].value == "") {

				alert("Disculpe, debe seleccionar un "+fieldName+".");
				element.focus();
				scrollToElement(element, -30);
				return false;
			}
			break;
		default:
			alert("Error de validación.");
			return false;
			break;
	}
	return true;
}

function validateEmail(email) {
	var emailFilter = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	if(!emailFilter.test(email.value)) {
		alert("La dirección de e-mail ingresada parece no ser válida.");
		email.select();
		scrollToElement(email, -30);
		return false;
	}
	return true;
}

function validateCaptcha(captcha, captchaID) {
	var captchaLength = 5;
	
	if(parseInt(captcha.value.length) == captchaLength) {
		var parameters = "captcha="+captcha.value+"&captchaID="+captchaID;
		var ajax = new AjaxCall(config.root+"/ajax/checkCaptcha.php", parameters, checkCaptchaCallback, null);
		ajax.doGET();
	}
}

function checkCaptchaCallback(responseText, readyState, userData)
{
	var captchaRequired = document.getElementById('captchaRequired');
	var captchaLoading = document.getElementById('captchaLoading');
	var captchaLoadingText = document.getElementById('captchaLoadingText');
	var captcha = document.getElementById('captcha');
	
	if(readyState == 1) {
		captchaRequired.style.display = "none";
		captchaLoading.style.display = "inline-block";
		captchaLoadingText.style.display = "inline-block";
		captcha.readOnly = true;
	}
	if(readyState == 4) {
		captchaLoading.style.display = "none";
		captchaLoadingText.style.display = "none";

		if(responseText == "true") {
			captchaRequired.style.display = "none";
			captcha.style.border = "1px solid #0b0";
			document.getElementById('submitButton').disabled = false;
			captcha.readOnly = true;
			captcha.blur();		// for IE bug where the input can be edited if it still has focus
			captcha.onkeyup = null;
		}else {
			captchaRequired.style.display = "inline-block";
			captcha.style.border = "1px solid #b00";
			captcha.readOnly = false;
		}
	}
}

function validateNumber(field, fieldName) {
	if(isNaN(field.value)) {
		alert("El valor para "+fieldName+" debe ser un número.");
		email.select();
		scrollToElement(field, -30);
		return false;
	}
	return true;
}

function validateTitle(title, bad_titles)
{
	var filtered_title = title.value.toLowerCase();
	filtered_title = filtered_title.replace(/^\s+|\s+$/g,"");		// Trim string
	filtered_title = filtered_title.replace(/[^a-z0-9 ]+/gi,"");	// Remove non alphanumeric characters
	filtered_title = filtered_title.replace(/[ ]{2,}/g," ");		// Remove multiple spaces

	for(var key in bad_titles) {
		if(bad_titles[key] == filtered_title) {
			alert("El título de tu aviso es demasiado general. Para mejorar las posibilidades de que alguien responda, intentá usar un título mas específico.");
			title.select();
			scrollToElement(title, -30);
			return false;
		}
	}
	return true;
}
/*
// Broken Images Replacer
var imgsLoaded = 0;
var imgStatus = new Array();var images = document.getElementsByTagName("IMG");
function setImgLoadStatus(obj)
{
	imgStatus[obj.src] = true;
	imgsLoaded++;
	//alert(imgsLoaded+' / '+images.length);
	if(imgsLoaded >= images.length) replaceFailedImgs();
}

function replaceFailedImgs()
{
	for(var i=0; i < images.length ; i++) {
    	if(!imgStatus[images[i].src]) images[i].src = config.resHost+'/media/webart/s-noimage.gif?'+config.hash;
	}
}

function addEventImgOnLoad()
{
	for(var i=0; i < images.length ; i++) {
    	images[i].onload = function(){setImgLoadStatus(this);}
	}
}
*/
/* Google Maps */
function loadMap()
{
	if(!GBrowserIsCompatible()) return;
	var map = new GMap2(document.getElementById("map"));
	var coords = new GLatLng(document.form.latitude.value, document.form.longitude.value);
	map.setCenter(coords, 16);
	map.addOverlay(new GMarker(coords));
	map.setUIToDefault();
}

function clearCoordinates()
{
	document.form.latitude.value = "";
	document.form.longitude.value = "";
	document.getElementById('defineCoords').style.display='block';
	document.getElementById('coordsDefined').style.display='none';
	if(GBrowserIsCompatible()) GUnload();
}

/* IE can't change an element's name attribute after creation, so this function encapsulates a workaround. IE SUCKS. */
function createNamedElement(type, name) {
	var element = null;
	// Try the IE way; this fails on standards-compliant browsers
	try {
		element = document.createElement('<'+type+' name="'+name+'">');
	} catch(e) {}

	if(!element || element.nodeName != type.toUpperCase()) {
	// Non-IE browser; use canonical method to create named element
		element = document.createElement(type);
		element.name = name;
	}
	return element;
}


/*################################*/
/*########  flashcontrol  ########*/
/*################################*/
function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?');
  else
    return src + ext;
}

function AC_Generateobj(objAttrs, params, embedAttrs)
{
  var str = '<object ';
  for (var i in objAttrs)
    str += i + '="' + objAttrs[i] + '" ';
  str += '>';
  for (var i in params)
    str += '<param name="' + i + '" value="' + params[i] + '" /> ';
  str += '<embed ';
  for (var i in embedAttrs)
    str += i + '="' + embedAttrs[i] + '" ';
  str += ' ></embed></object>';

  if ( embedAttrs["sec"] ) inner(embedAttrs["sec"],str);
                      else document.write(str);
}

function AC_FL_RunContent(){

  var ret =
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );

  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_SW_RunContent(){
  var ret =
    AC_GetArgs
    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
     , null
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();

    switch (currArg){
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "flashvars": ret.params[srcParamName] = ret.params[srcParamName]+'?'+args[i+1];
                        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
                        break;

      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblClick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "width":
      case "height":
      case "align":
      case "vspace":
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "id":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}
/*################################*/
/*##########  eplanning  #########*/
/*################################*/
var sitio_id = "5aac";
var eplrnd = (new String(Math.random())).substring(2,8) + (((new Date()).getTime()) & 262143);
var sw = (self.innerWidth ? self.innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : document.body ? document.body.clientWidth : "");
var sh = (self.innerHeight ? self.innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body ? document.body.clientHeight : "");
var wh = (sw && sh) ? (sw.toString(16) + "x" + sh.toString(16)) : "";
var cs = document.charset || document.characterSet;

function eplAD(espacio_id) {
	var ad = '<scri' + 'pt language="JavaScript" type="text/javascript" src="http://ads.e-planning.net/eb/3/' + sitio_id + '/' + espacio_id + '?o=j&rnd=' + eplrnd + '&crs=' + cs + (wh ? ('&n=' + wh) : '') + '"></scri' + 'pt>';
	document.write(ad);
}
