/**
 * Global library
 * @author Pablo Del Valle <pablo@delvalle.co.cr>
 */
var inputBorder='7A9BBC';
/**
 * Returns a instance of DOM element
 * @access public
 * @return element
 * @param string obj Object name
 */
function getObject(obj)
 {
 var rObj;
 if(typeof obj=='string')
  {
  if(document.getElementById)rObj=document.getElementById(obj);
  else if(document.all)rObj=document.all[obj];
  }
 else if(obj.style)rObj=obj;
 return rObj;
 }
/**
 * Returns a instance of DOM element from an event triggered
 * @access public
 * @return element
 * @param string obj Object name
 */
function getTarget(ev)
 {
 var target;
 if(window.event&&window.event.srcElement)target=window.event.srcElement;
 else if(ev&&ev.target)target=ev.target;
 if(!target)return null;
 else return target;
 }
/**
 * Adds events to the page
 * @access public
 * @return mixed
 * @param node el DOM element
 * @param event ev Event
 * @param function fn Call back function
 * @param bool useCapture Capture bubble events
 */
function addEvent(el,ev,fn,useCapture)
 {
 if(useCapture==null)useCapture=false;
 if(el.addEventListener)
  {
  el.addEventListener(ev,fn,useCapture);
  return true;
  }
 else if(el.attachEvent)
  {
  var r=el.attachEvent('on'+ev,fn);
  EventCache.add(el,ev,fn);
  return r;
  }
 else elem['on'+evType]=fn;
 }
/**
 * Disables the default action of the element
 * @access public
 * @return bool
 * @param element el Element
 */
function disableDefault(el)
 {
 if(el&&el.preventDefault)el.preventDefault();
 if(window.event)window.event.returnValue=false;
 return false;
 }
/**
 * Disables bubble up
 * @access public
 * @return bool
 * @param element el Element
 */
function disablePropagation(el)
 {
 if(el&&el.stopPropagation)el.stopPropagation();
 if(window.event)window.event.cancelBubble=true;
 return false;
 }
/**
 * Validates a form
 * @access public
 * @param element Form object
 */
var validation=
 {
 check:function(e,obj)
  {
  if(e)var thisForm=getTarget(e);
  else var thisForm=obj;
  if(getObject('DIVsuggestions'))if(getObject('DIVsuggestions').style.display=='block')
   {
   disablePropagation(e);
   disableDefault(e);
   if(dhtml.suggest.fd)
    {
    dhtml.suggest.fd.focus();
    dhtml.suggest.fd.select();
    }
   return false;
   }
  var formError=false,focusOn=null,validationObject='';
  if(thisForm.nodeName!='FORM')
   {
   do{thisForm=thisForm.parentNode;}
   while(thisForm.nodeName!='FORM')
   }
  validationObject=validation[thisForm.id.replace(/[0-9]/g,'')];
  extraId=thisForm.id.replace(/[^0-9]/g,'');
  for(var i in validationObject['inputs'])
   {
   errorSpan=(i.toString()+extraId).replace('TXT','');
   errorSpan=errorSpan.replace('SLT','');
   errorSpan=errorSpan.replace('TXA','');
   errorSpan=errorSpan.replace('PWD','');
   errorSpan=errorSpan.replace('CHK','');
   if((/^(TXT)|(TXA)|(SLT)|(PWD)/.test(i.toString())&&!validationObject['inputs'][i]['regExp'].test(getObject(i.toString()+extraId).value))||(/^CHK/.test(i.toString())&&!validationObject['inputs'][i]['regExp'].test(getObject(i.toString()+extraId).checked)))
    {
    formError=true;
    getObject(i.toString()+extraId).style.border='1px solid #F00';
    if(getObject('SPN'+errorSpan+'Error'))
     {
     getObject('SPN'+errorSpan+'Error').innerHTML='<img src="../../../cse/images/icons/error.gif" alt="Error" title="Error" class="middle"/> '+validationObject['inputs'][i]['errorString'];
     setClass(getObject('SPN'+errorSpan+'Error'),'error');
     }
    if(!focusOn)focusOn=getObject(i.toString()+extraId);
    }
   else
    {
    if(/^(TXT)|(TXA)|(SLT)|(PWD)/.test(i.toString()))getObject(i.toString()+extraId).style.border='1px solid #'+inputBorder;
    else getObject(i.toString()+extraId).style.border='0px solid #000';
    if(getObject('SPN'+errorSpan+'Error'))getObject('SPN'+errorSpan+'Error').innerHTML='';
    }
   }
  if(formError)
   {
   alert('Por favor, revise los datos suministrados.');
   focusOn.focus();
   disablePropagation(e);
   disableDefault(e);
   return false;
   }
  else if(typeof validationObject['success']=='function')
   {
   disablePropagation(e);
   disableDefault(e);
   validationObject['success'].apply(null,[extraId]);
   return false;
   }
  else return true;
  }
 }
/**
 * Escapes the string to make it URL-safe
 * @access public
 * @return string
 * @param string url The URL that needs to be escaped
 */
String.prototype.escapeURI=function(){return this.replace(/\&/g,'%26');}
/**
 * Decodes a URL-safe string
 * @access public
 * @return string
 * @param string url The URL that needs to be decoded
 */
String.prototype.decodeURI=function()
 {
 var r='';
 r=this.replace(/%2F/g,'/');
 r=r.replace(/%2B/g,'+');
 return r;
 }
/**
 * Sets the class for an object
 * @access public
 * @return void
 * @param element obj Reference to tha object to be manipulated
 * @param string c Name of the new class
 */
function setClass(obj,c)
 {
 if(obj)
  {
  obj.setAttribute('class',c);
  obj.setAttribute('className',c);
  }
 }
/**
 * Unsets the and free memory for events
 */
var EventCache=function()
 {
 var listEvents=[];
 return{
  listEvents:listEvents,
  add:function(node,sEventName,fHandler,bCapture){listEvents.push(arguments);},
  flush:function()
   {
   var i,item;
   for(i=listEvents.length-1;i>=0;i=i-1)
    {
    item=listEvents[i];
    if(item[0].removeEventListener){item[0].removeEventListener(item[1],item[2],item[3]);};
    if(item[1].substring(0,2)!='on'){item[1]='on'+item[1];};
    if(item[0].detachEvent){item[0].detachEvent(item[1],item[2]);};
    item[0][item[1]]=null;
    };
   }
  };
 }();
/**
 * Updates the color and content of all inputs
 * @access public
 * @return void
 */
function updateInputDefaultColors()
 {
 //sets the color black on each input,textarea,select
 var inputs=document.getElementsByTagName('input');
 for(var i=0;i<inputs.length;i++)
  {
  if(inputs[i].className=='loadingInput')inputs[i].style.color='#8F8F8F';
  else inputs[i].style.color='#444';
  }
 var textareas=document.getElementsByTagName('textarea');
 for(var i=0;i<textareas.length;i++)
  {
  if(textareas[i].className=='loadingInput')textareas[i].style.color='#8F8F8F';
  else textareas[i].style.color='#444';
  }
 var selects=document.getElementsByTagName('select');
 for(var i=0;i<selects.length;i++)
  {
  if(selects[i].className=='loadingInput')selects[i].style.color='#8F8F8F';
  else selects[i].style.color='#444';
  }
 }
/**
 * Gets the values of multiple select
 * @access public
 * @param object obj
 * @param string type
 * @return void
 */
function getMultipleSelectValues(obj,sep)
 {
 if(!sep)sep=',';
 var ret='';
 for(var i=obj.options.length-1;i>=0;i--)if(obj.options[i].selected)ret+=(ret==''?'':sep)+obj.options[i].value;
 return ret;
 }
/**
 * Gets the key code on key action
 * @access public
 * @return void
 */
function getKey(e)
 {
 if(document.all)return e.keyCode;
 else return e.which;
 }
/**
 * Disables/Enables a button
 * @access public
 * @return void
 */
function buttonStatus(obj,status)
 {
 obj.disabled=!status;
 if(!status)
  {
  obj.style.color='#6F6F6F';
  obj.style.border='1px solid #6F6F6F';
  }
 else
  {
  obj.style.color='#444';
  obj.style.border='1px solid #'+inputBorder;
  }
 }
/**
 * Gets the size of a file in human readable form
 * @access public
 * @return string
 */
function size_hum_read(size)
 {
 if(!size)return'--';
 i=0;
 iec=Array('b','kb','mb','gb','tb','pb','eb','zb','yb');
 while((size/1024)>1)
  {
  size=size/1024;
  i++;
  }
 var sizeString=size.toString();
 sizeString=sizeString.substring(0,sizeString.indexOf('.')+4);
 return(sizeString==''?size:sizeString)+iec[i]+'.';
 }
/**
 * Rounds numbers to 2 decimals
 * @access public
 * @return void
 */
function cRound(num,prec){return num.toFixed(prec?prec:2);}
/**
 * Fires up all the events and functions
 * @access public
 * @return void
 */
function init_scripts()
 {
 if(!document.getElementsByTagName||!document.getElementById)return;
 if(Array.prototype.push==null)
  {
  Array.prototype.push=function()
   {
   for(var i=0;i<arguments.length;i++)
    {
    this[this.length]=arguments[i];
    };
   return this.length;
   };
  };
 //sets the rel="external" on each anchor element
 var anchors=document.getElementsByTagName('a');
 for(var i=0;i<anchors.length;i++)
  {
  var anchor=anchors[i];
  if(anchor.getAttribute('href')&&anchor.getAttribute('rel')=='external')anchor.target='_blank';
  }   if(typeof init=='function')init(); updateInputDefaultColors();
 }
//=========================================================================\\
addEvent(window,'load',init_scripts);
addEvent(window,'unload',EventCache.flush);
