Function.prototype.bind = function(obj) { 
	var method = this, 
	temp = function() { 
		return method.apply(obj, arguments);		
		}; 
    return temp; 
 }; 
function initAjax() {
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		this.http_request = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
		try {
			this.http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				this.http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (eroare) {
				alert('eroare');
			}
		}
	}
	if (!this.http_request) {
		alert('Cannot create XMLHTTP instance');
		return false;
	}
	return true;
}
function responseTextToXML(){
	var xmlDoc;
	if ((document.implementation && document.implementation.createDocument)){
		xmlDoc = this.http_request.responseXML;
	} else {
		if (window.ActiveXObject){//In case to be the internet explorer Create a xml tag in run time
			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.loadXML(this.http_request.responseText.substr(21));
		}
	}
	return xmlDoc;
}
function alertContents() {
	switch(this.http_request.readyState){
		case 0:
		if($(this.loading)){
			$(this.loading).style.visibility='visible';//|hidden|collapse
			}
		break;
		case 1:
		break;
		case 2:
		break;
		case 3:
		break;
		case 4:
			switch(this.http_request.status){
			case 200:
				this.onAjaxReady();
			break;
			case 404:
				this.rezultat.innerHTML = 'Action or address has not been found ; Error 404';
			break;
			default:
				this.rezultat.innerHTML = 'There was a problem with the request';
			}
		if($(this.loading)){
			$(this.loading).style.visibility='hidden';
		}
		break;
	}
}
function makeRequest(method) {
	//debugger;
try{
//	alert(this.loading)
	if(this.loading){
	//alert(this.loading.innerHTML)
		this.loading.style.visibility='visible';
	}
	var str="",hasFile=false;
	switch(this.type){
		case "form":
			str=this.wrapAsUrlencoded(this.objectArray);
			hasFile=this.hasFiles(this.objectArray);
		break;
		case "clasa":
			str=wrapAsUrlencoded(this.objectArray);
			hasFile=this.hasFiles(this.objectArray);
		break;
		case "":
		case "undefined":
		case "string":
			str=this.poststr;
			hasFile=false;
		break;
		case "asociative":
			//str=wrapAsociativeUrlencoded(tablou)
		break;
		default:
	}
	this.initAjax();
	this.http_request.onreadystatechange = alertContents.bind(this);
	this.http_request.open(method, this.adress+this.getstr, this.modAsincron);
	if((this.mode=="binary")&&(BrowserDetect.browser==="Firefox")&&(parseInt(BrowserDetect.version,10)>=3)){
			var boundary = "",contentType="";
			boundary    = "AJAX--------------" + (new Date()).getTime();
			contentType = "multipart/form-data; boundary=" + boundary;
			this.binaryData = this.wrapAsBinary(this.objectArray, boundary);
		this.http_request.setRequestHeader("Content-Type", contentType);
		this.http_request.sendAsBinary(this.binaryData); 
	}else{
		//alert('aici')
		if(hasFile){
			this.transferContainer=document.createElement('div');
			this.transferContainer.style.display='none';
			this.transferContainer.id='transferContainer'+ (new Date()).getTime();
			var formIframe=this.rezultat.getElementsByTagName('iframe')
			if(formIframe[0]){
				//iframeElement.value=1;
				this.iframe=formIframe[0];
			}else{
				this.iframe = document.createElement('iframe');
				this.iframe.id='upload_target' + (new Date()).getTime();
				this.iframe.name=this.iframe.id;
				this.iframe.src='#';
			//	this.iframe.style.width='1500px';
			//	this.iframe.style.height='1500px';
				this.rezultat.appendChild(this.transferContainer);
				this.transferContainer.appendChild(this.iframe);
			}
			if(self.frames[this.iframe.id].name != this.iframe.id) {
				self.frames[this.iframe.id].name = this.iframe.id;
			}
			//this.iframe.onload=
			var iframeOnLoad=onIframeTransferFinishedDone.bind(this)
			Event.observe(this.iframe,'load', iframeOnLoad);

			this.form.enctype='multipart/form-data';
			this.form.encoding='multipart/form-data';
			this.form.method=method;
			this.form.action=this.adress;
			this.form.action+=this.getstr;
			this.form.target=this.iframe.id;
			this.form.submit();
		}else{
			this.http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			this.http_request.setRequestHeader("Content-length", str.length);
			this.http_request.send(str);
		}
	}
	// var isGecko = (document.addEventListener) ? true : false;
	// if (!this.modAsincron && isGecko) {
		// this.alertContents();
	// }
}catch(e){
	alert('eruare')
	alert(e);
	// if(console){
		// console.log(e)
	// }else{
		// alert(e);
	// }




	   alert(e.number & 0xFFFF)
   alert(e.description)
   alert(e.message)
   alert(e.name)

}
}
function hasLoading(){
	if(this.rezultat){
		var spanInputs=this.rezultat.getElementsByTagName('span')
		for(var i=0;i<spanInputs.length;++i){
			if(spanInputs[i].id.indexOf('loadingContainer')!==-1){
				return spanInputs[i];
			}
		}
		var divInputs=this.rezultat.getElementsByTagName('div')
		for(var i=0;i<divInputs.length;++i){
			if(divInputs[i].id.indexOf('loadingContainer')!==-1){
				return spanInputs[i];
			}
		}
	}else{
	}
	return false;
}
function onIframeTransferFinishedDone(){
	//alert(this.loading)
	this.loading.style.visibility='hidden';
	this.onAjaxReady();
}
function getFormData(form){
	var fields = [];
	for(var i=0;i<form.length;++i){
		fields.push(form.elements[i]);
	}
	return fields;
}
function hasFiles(tablou){
	for(var i=0;i<tablou.length;++i){
		if(tablou[i].type=='file'){
			return true;
		}
	}
	return false;
}
function wrapAsBinary(elemente,boundary){
    var CRLF  = "\r\n";
    var parts = [];
	var k;
	for(k in elemente){
		if(elemente[k].nodeName){
			var part = "";
			var type;// = "TEXT";
				if (elemente[k].nodeName.toUpperCase() === "INPUT"||elemente[k].nodeName.toUpperCase() === "SELECT") {
					type = elemente[k].type;//.toUpperCase();
				}
			if (type === "file" && elemente[k].files.length > 0) {
				var fieldName = elemente[k].name;
				var fileName  = elemente[k].files[0].fileName;
				part += 'Content-Disposition: form-data; ';
				part += 'name="' + fieldName + '"; ';
				part += 'filename="'+ fileName + '"' + CRLF;
				part += "Content-Type: application/octet-stream";
				part += CRLF + CRLF;
				part += elemente[k].files[0].getAsBinary() + CRLF;
				parts.push(part);
			}else{
				if (type === "select-multiple") {
				  var j,count = 0;
				  for (j=0; j<elemente[k].options.length; ++j) {
					if (elemente[k].options[j].selected) {
						part += 'Content-Disposition: form-data; ';
						part += 'name="' + elemente[k].name + '"' + CRLF + CRLF;
						part += escape(elemente[k].options[j].value) + CRLF;
						parts.push(part);
						part="";
						++count;
					}
				  }
				}else{
					part += 'Content-Disposition: form-data; ';
					part += 'name="' + elemente[k].name + '"' + CRLF + CRLF;
					part += elemente[k].value + CRLF;
					parts.push(part);
				}
			}
		}	
	}
	var request = "--" + boundary + CRLF;
	request+= parts.join("--" + boundary + CRLF);
	request+= "--" + boundary + "--" + CRLF;
    return request;
}
function wrapAsUrlencoded(intrari){
	var str="",i;
	for (i in intrari) {
		if(intrari[i]){
			if (intrari[i].name !== undefined && (intrari[i].type != "submit") && intrari[i].value !== undefined) {
				if(intrari[i].type=="select-multiple"){
				  var j,count = 0;
				  for (j=0; j<intrari[i].options.length; ++j) {
					if (intrari[i].options[j].selected) {
					  str += intrari[i].name + "=" +escape(intrari[i].options[j].value) + "&";
					  ++count;
					}
				  }
				}else{
					str += intrari[i].name + "=" +  intrari[i].value + "&";
				}
			}
		}
	}
	return str;
}
function wrapAsociativeUrlencoded(intrari){
var str="",i;
	for (i in intrari) {
		if (i!== undefined && intrari[i] !== undefined) {
				str += i + "=" +  intrari[i] + "&";
			}
		}
	return str;
}
function get(objectsArray,method,data) {
	//var intrari = objectsArray//$$(cssClass);
	if(this.poststr) {
		this.poststr+='&';
	}
	// if($(this.loading)){
		// $(this.loading).innerHTML="<img src='"+this.loadingImage+"alt='loading'/>";
	// }else{
		// this.rezultat.innerHTML="<span id='"+this.loading+"'><img src='"+this.loadingImage+"' alt='loading'/></span>";
	// }	
	this.poststr+=wrapAsUrlencoded(objectsArray);
	this.makeRequest(method);
	return false;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function fillFromXML(xmlDocument,arrayObiecte){
	var tablou=[];
	if((arrayObiecte!=undefined)){
		tablou=arrayObiecte;
	}else{
		tablou=this.objectArray;
	}
	for(i=1;i<tablou.length;i++){
	if((tablou[i].type!=='submit')&&(tablou[i].type!=='reset')){//nu curatam si valoarea butoanelor
		tablou[i].value='';//curata locul
		}
	}
	for(i=0;i<xmlDocument.firstChild.childNodes.length;i++){
		var element=xmlDocument.firstChild.childNodes[i],
			numeElement=element.nodeName,
			valoareElement=element.nodeValue,
			objectElement=this.findInObjectArray(numeElement,tablou);
		if(objectElement){
			var tip=objectElement.type;
			switch(tip){
				case 'text':
				case 'select-one':
				case 'textarea':
				if(element.firstChild.nodeValue===''){
					objectElement.value=' ';
				}else{
					objectElement.value=element.firstChild.nodeValue;
				}
				break;
				case 'checkbox':
				if((element.firstChild.nodeValue>=1)){
					objectElement.checked=true;
					objectElement.value=1;
				}else{
					objectElement.checked=false;
					objectElement.value=0;
				}
				break;
				case 'image':
				if(element.firstChild.nodeValue!==''&&element.firstChild.nodeValue!==0){
					$(numeElement).src=element.firstChild.nodeValue;
					$(numeElement).value=element.firstChild.nodeValue;
				}else{
					objectElement.src='./images/faraimagine.gif';
					objectElement.value='./images/faraimagine.gif';
				}
				break;
			}
		}
	}
	return true;
}
function findInObjectArray(valoare,arrayObiecte){
	var tablou=[];
	if((arrayObiecte!='undefined')&&(arrayObiecte.length)){
		tablou=arrayObiecte;
	}else{
		tablou=this.objectArray;
	}
	for(var i=0;i<tablou.length;++i){
		if(tablou[i].name===valoare){
			return tablou[i];
		}
	}
	return false;
}
function ajax(adresa,rezultatContainer,loadingImage,objectContainer,mode) {
	//properties
	this.http_request = false;
	this.rezultat = rezultatContainer;
	this.poststr = '';
	this.getstr='';
	if(objectContainer!==''&&objectContainer&&objectContainer!=undefined){
		if(objectContainer.elements){
			this.type='form';
			this.form = objectContainer;
			this.objectArray=objectContainer.elements;
			this.method=objectContainer.method;
			if(this.adress!==''){
				this.adress = adresa;
			}else{
				this.adress = objectContainer.action;
			}
		}else{
			this.type='clasa';
			this.form = objectContainer;
			this.objectArray=objectContainer;
			this.adress=adresa;
		}
	}else{
		this.type='string';
		this.adress=adresa;
	}
	this.modAsincron=true;
	this.mode=mode;
	///////////////////////////////////////////////
	this.iframe="";
	this.transferContainer="";
	this.loadingImage = loadingImage;
	this.hasLoading=hasLoading;
	this.loading=this.hasLoading();
	if(this.loading){
		this.loading.innerHTML="<img src='"+this.loadingImage+"' alt='loading'/>";
	}else{
		if(this.rezultat&&this.rezultat!==''&&this.rezultat!==undefined){
			this.loading = document.createElement('span');
			this.loading.id = 'loadingContainer'+(new Date()).getTime();
			this.loadingImageObject = document.createElement('img');
			this.loadingImageObject.src	= this.loadingImage;
			this.loadingImageObject.alt='Loading';
			this.rezultat.appendChild(this.loading);
			this.loading.appendChild(this.loadingImageObject);
		}
	}
	//////////////////////////////////
	//method
	this.initAjax = initAjax;
	this.makeRequest = makeRequest;
	this.alertContents = alertContents;
	this.get=get;
	this.onAjaxReady=function(){};
	this.afterAjaxReady=function(){};
	this.onAjaxProgress=function(){};
	this.responseTextToXML=responseTextToXML;
	this.wrapAsBinary=wrapAsBinary;
	this.wrapAsUrlencoded=wrapAsUrlencoded;
	this.getFormData=getFormData;
	this.hasFiles=hasFiles;
	this.fillFromXML=fillFromXML;
	this.findInObjectArray=findInObjectArray;
}