AjaxResponse = function(success, statusCode, text, xml, resultObjId, widget, reloadWidDependents) {
    this.success = success;
    this.statusCode = statusCode;
    this.text = text;
    this.xml = xml;
    this.resultObjId = resultObjId;
    this.widget = widget;
    this.reloadWidDependents = reloadWidDependents;
}

Ajax = function () {
};

Ajax.callCount = 0;

Ajax.errorHtml = '<table width="98%" align="center" cellpadding="1" cellspacing="1" style="border:1px dotted rgb(210, 205, 175); background-color: rgb(252, 238, 238);">' +
                 '<tr><td width="35px"><img alt="Error" src="components/com_cicomments/images/warning.gif" title="Error" height="30" width="30"/></td>' +
                 '<td valign="middle" align="left">' +
                 '<p class="smallLinkBold">Loading Aborted or Error Loading Data! Please Refresh the Panel or Retry your Request.</p></td>' +
                 '</tr></table><br/>';

Ajax.createAjaxRequestObj = function () {
    var xmlHttpReq;
    try {
        xmlHttpReq = new XMLHttpRequest();
    } catch (trymicrosoft) {
        try {
            xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (othermicrosoft) {
            try {
                xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (failed) {
                xmlHttpReq = false;
            }
        }
    }

    if (!xmlHttpReq) {
        alert("Error initializing XMLHttpRequest!");
    }

    return xmlHttpReq;
};

Ajax.doRequestCall = function (url, callback, params, asynch, method, resultObjId, widget, reloadWidDependents) {
    var ff3Hack = false;
    var xmlHttpRequest = Ajax.createAjaxRequestObj();
    if (xmlHttpRequest) {
        method = method.toUpperCase();

        // Check if it's FireFox 3.0
        if (navigator.userAgent) {
            var agent = navigator.userAgent.toLowerCase();
            if (agent.indexOf("firefox/3.0") > -1) {
                // if so.. add the params to the url and treat the request like a GET
                // There seems to be an EAS 5.x issue since Firefox 3.0 started appending the charset
                // to the Content-Type header. Since then the parameters don't get parsed.
                ff3Hack = true;
            }
        }

        if (ff3Hack) {
            method = "GET";
            url = url + "?" + params;
            params = null;
        }

        xmlHttpRequest.open(method, url, asynch);
        if (method == "POST") {
            xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttpRequest.setRequestHeader("Content-length", params.length);
        }

        xmlHttpRequest.onreadystatechange = function() {
            if (xmlHttpRequest.readyState == 4) {
                var success = false;
				var reqStatus = -1;
				try {
                	if (xmlHttpRequest.status == 200) {
                    	success = true;
						reqStatus = xmlHttpRequest.status;
                	}
				} catch (somebug) {}

                var resp = new AjaxResponse(success, reqStatus, xmlHttpRequest.responseText, xmlHttpRequest.responseXML, resultObjId, widget, reloadWidDependents );

                callback(resp);
            }
        }
        xmlHttpRequest.send(params);
        Ajax.callCount++;
    }
};

Ajax.doGet = function (url, callback, asynch, resultObjId) {
    Ajax.doRequestCall(url, callback, null, asynch, "GET", resultObjId);
};

Ajax.doPost = function (url, callback, asynch, resultObjId, params) {
    Ajax.doRequestCall(url, callback, params, asynch, "POST", resultObjId);
};

Ajax.refreshWidget = function(ajaxRes) {
   if (ajaxRes instanceof AjaxResponse) {
      if (ajaxRes.success) {
         var renObj = document.getElementById(ajaxRes.resultObjId);
         if (renObj) {
            renObj.innerHTML = ajaxRes.text;
            //Ajax.evalJS(ajaxRes.text);
         }
      } else {
         var renObj = document.getElementById(ajaxRes.resultObjId);
         if (renObj) {
            renObj.innerHTML = Ajax.errorHtml;
         } else {
            //alert("Asynch Error Loading Data !!:"+ajaxRes.statusCode);
         }
      }
   }
}

Ajax.evalJS = function(txt) {
    var openScript = '<script type="text/javascript">';
    var closeScript = '</script>';
    var oIdx = txt.indexOf(openScript);
    var cIdx = txt.indexOf(closeScript);
    try {
        while (oIdx >= 0) {
            // extract js
            var js = txt.substring(oIdx + openScript.length, cIdx);
            // eval it
            eval(js);
            // get next idx
            oIdx = cIdx + closeScript.length;
            oIdx = txt.indexOf(openScript, oIdx);
            cIdx = txt.indexOf(closeScript, oIdx);
        }
    } catch(e) {
        alert(e);
    }
}

Ajax.showLoading = function(contId) {
    var divObj = document.getElementById(contId);
    if (divObj) {
        divObj.innerHTML = "<div width='100%' style='border:1px dotted rgb(240,230,220)'><img src='components/com_cicomments/images/ajax-loader.gif' alt='Loading' title='Loading'/></div>";
    }
}

Ajax.serializeFormInputs = function (formId) {
   var paramStr = "";
   var formObj = document.getElementById(formId);
   if (formObj) {
      var eles = formObj.elements;
	  for (var i=0; i < eles.length; i++) {
	     paramStr += Ajax.serializeInput(eles[i]);
	  }
   }
   return paramStr;
}

Ajax.serializeInput = function (inpObj) {
   var paramStr = "";
   if (inpObj.disabled) {
      return paramStr;
   }

   switch(inpObj.type) {
      case "text":
	     paramStr += "&"+inpObj.name+"=";
	     paramStr += encodeURI(inpObj.value);
		 break;
      case "textarea":
	     paramStr += "&"+inpObj.name+"=";
	     paramStr += encodeURI(inpObj.value);
		 break;
      case "hidden":
	     paramStr += "&"+inpObj.name+"=";
         paramStr += encodeURI(inpObj.value);
		 break;
      case "select-one":
	     paramStr += "&"+inpObj.name+"=";
         if (inpObj.selectedIndex >= 0) {
            paramStr += encodeURI(inpObj.options[inpObj.selectedIndex].value);
         } else {
            paramStr += encodeURI("");
         }
		 break;
      case "select-multiple":
	     for (var j=0; j < inpObj.length; j++) {
		    if (inpObj.options[j].selected) {
			   paramStr += "&"+inpObj.name+"=";
			   paramStr += encodeURI(inpObj.options[j].value);
		    }
	     }
		 break;
      case "checkbox":
      case "radio":
	     if (inpObj.checked) {
		    paramStr = "&"+inpObj.name+"=";
			paramStr += encodeURI(inpObj.value);
	     }
   }
   return paramStr;
}
