/*
********************************************************
Copyright @ WebOnWebOff.com, by D. Miller
You may reuse this script, on condition that this copyright text is kept
www.WebOnWebOff.com

y_util vs. 1.0.3
********************************************************
*/
ylib.namespace('ylib.util');


/* isTextChar */
ylib.util.isTextChar = function(keyCode){
	if(isNaN(keyCode)) return false;
	switch(keyCode){
		case 10,13: //carriage return
			return true;
		case 127:	//DEL
			return false;
		default:
			if(keyCode>=0&&keyCode<=47) return false;
			if(keyCode>=91&&keyCode<=95) return false;
			if(keyCode>=112&&keyCode<=187) return false;
	}
	return true;
}

/* SetOptionSelected */
ylib.util.SetOptionSelected = function(opt, val){
	if(!opt) return;
	opt.selected = val;
	opt.defaultSelected = val;
}

/* FindValueInList */
ylib.util.FindValueInList = function(sValue, sList){
	var tValue;
	sValue = sValue.replace(/^\s+|\s+$/, '');
	if(sList.indexOf(",")==-1){
		return (sList.replace(/^\s+|\s+$/, '') == sValue);
	}
	var sArr;	
	//find in list
	eval("sArr = [" + sList + "];");
	for(var i=0; i<sArr.length; i++){		
		tValue = sArr[i].toString().replace(/^\s+|\s+$/, '');
		if(tValue==sValue) return true;
	}
	return false;
}

/* GetTotalOffsets */
ylib.util.GetTotalOffsets = function(elem) {
    var totalTop = 0;
    var totalLeft = 0;
    while(elem){
        totalTop += elem.offsetTop;
        totalLeft += elem.offsetLeft;
        elem = elem.offsetParent;
    }
    return {top:totalTop,left:totalLeft};
}

/* Ajax */

ylib.util.READY_STATE_UNINITIALIZED=0;
ylib.util.READY_STATE_LOADING=1;
ylib.util.READY_STATE_LOADED=2;
ylib.util.READY_STATE_INTERACTIVE=3;
ylib.util.READY_STATE_COMPLETE=4;
/* Ajax DefaultErrorHandler */
ylib.util.DefaultErrorHandler = function(request){
  var mess = "error fetching data!";
  if(this){
    if(this.url) mess += "\n\nurl:"+this.url;
    if(this.method) mess += "\n\nmethod:"+this.method;
    if(this.contentType) mess += "\n\ncontentType:"+this.contentType;
    if(this.params) mess += "\n\nparams:"+this.params;
    if(this.error){
        if(this.error.name) mess += "\n\nerror name:"+this.error.name;
        if(this.error.message) mess += "\n\nerror message:"+this.error.message;
    }
  }
  if(request){
      if(request.readyState) mess += "\n\nreadyState:"+request.readyState;
      try {
        if(request.status) mess += "\n\nstatus:"+request.status;
      } catch (err) {}
      try {
        if(request.getAllResponseHeaders) mess += "\n\nheaders:"+request.getAllResponseHeaders();
      } catch (err) {}
  }
  alert(mess);
}

/* ContentLoader */
ylib.util.ContentLoader = function(component,url,callBackHandler,errorHandler,method,params,contentType){
  this.component = component;
  this.url = url;
  this.callBackHandler = callBackHandler;
  this.errorHandler = (errorHandler) ? errorHandler : ylib.util.DefaultErrorHandler;
  this.method = (method) ? method : 'GET';
  this.params = (params) ? params : []; //constant params
  this.contentType = contentType;
  if (!contentType && method=="POST"){
    this.contentType='application/x-www-form-urlencoded';
  }
}
ylib.util.ContentLoader.prototype = {
    SendRequest : function(){
      var request = this.GetTransport();
      if (request){ 
        //get current request params
        var requestParams = [];
        for(var i=0; i<arguments.length; i++){
            requestParams.push(arguments[i]);
        }
        //send request
        var loader = this;
        var url = this.url;
        if(this.method=='GET' && requestParams.length>0){
            var qs = this.GetFullQuerystring(requestParams);
            if(qs){
                if(url.indexOf('?')==-1){
                    url += '?' + qs;
                } else {
                    url += '&' + qs;
                }
            }
        }
        try{
            request.onreadystatechange = function() { loader.HandleAjaxResponse.call(loader, request); }            
            request.open(this.method, url, true);
            if(this.contentType) request.setRequestHeader('Content-Type', this.contentType); 
            request.setRequestHeader('encoding', 'UTF-8'); 
            if(this.method=='GET'){
                request.send(null);
            } else {                   
                request.send(this.GetFullQuerystring(requestParams));
            }
        }catch (err){
            loader.error = err;
            this.errorHandler.call(loader, request);
        }
      }
    },
    GetTransport : function(){
        var transport;  
        if (window.XMLHttpRequest){
            transport = new XMLHttpRequest();
        } else if (window.ActiveXObject){
            transport = new ActiveXObject("Microsoft.XMLHTTP");
        }  
        return transport;  
    },
    GetFullQuerystring : function(args){ 
        var requestParams = [];
        //constant params      
        for(var i=0; i < this.params.length; i++){
            if(this.params[i]) requestParams.push(this.params[i]);
        }
        //request params
        for(var i=0; i < args.length; i++){
            if(args[i]) requestParams.push(args[i]);
        }
        //convert to string
        var qs = "";
        if(requestParams && requestParams.length > 0){
            /*for(var i=0; i < requestParams.length; i++){
                qs += requestParams[i] + "&";
            }
            qs = qs.substring(0, qs.length-1); */
            qs = requestParams.join("&");
        }
        return qs;
    },
    HandleAjaxResponse : function(request){
      var loader = this;
      if (request.readyState==ylib.util.READY_STATE_COMPLETE){
        if (loader.RequestSuccess(request)){
          loader.callBackHandler.call(loader, request);
        } else {
          loader.errorHandler.call(loader, request);
        }
        request = null;
      }
    },
    RequestSuccess : function(request) {
        return request.status == 0 ||
             ( request.status >= 200 && request.status < 300 );
    },
    ClearUp : function(){
      this.component=null;
      this.callBackHandler=null;
      this.errorHandler=null;
    }
}