/* AJAX PHRASES */

/*
if(!Exception) {
	
	function ObjectException(className, methodName, errno, error) {
		this.class = className;
		this.method = methodName;
		this.errno = errno;
		this.error = error;
	}
	
	
}
*/

function AjaxPhrases(oDefault) {
	this.http_request = null;		
	this._create();
	this.defaultGetParams = {
		queryType: 		"list",
		returnXML:		true,
		returnType: 	"xmlOption",
		order:			"natural",
		script:			"data.php",
		timeout:		10000		
	};
	
	
	for(i in oDefault) {
		this.defaultGetParams[i] = oDefault[i];
	}
	
	
	this.currentQuery = new Object();
	this.currentQuery.params = new Object();
	this.currentQuery.params.onComplete = null;
	this.currentQuery.params.onCompleteParsed = null;
	this.currentQuery.params.onError = null;
	
	
	this.currentQuery.data = new Object();
	
}

AjaxPhrases.prototype._create = function() {
	if(window.XMLHttpRequest) {
		this.http_request = new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		try {
			this.http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				this.http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}		
}


/*
Definicja parametrów 

type: 'list', 'phrase'
path: scieżka z której mają być pobrane wyrażenia eg.: /ASPIRUM/DATA/....
return: sposób zwracania wyrażeń (format) 
order: .....

Narazie realizujemy najprostrzy układ: lista, zwraca xmlOption - podobny do option

 
*/

AjaxPhrases.prototype.get = function(oParams, oData) {
	
	//trace("AjaxPhrases.get(): path="+oData.path);

	if(this.http_request.readyState != 0 && this.http_request.readyState != 4) {
		throw("AjaxPhrases.get: not ready yet: " + this.http_request.readyState);
		return false;
	}
	
	var aPhrase = this;
	
	this.currentQuery.params = oParams;
	this.currentQuery.data = oData;
	
	//alert(this._urlEncode());
	this.http_request.open('GET', this._urlEncode(), true);
	this.http_request.send(null);
	
	
	this._timeout_id = window.setTimeout(function() { aPhrase._onTimeOut(); }, this.defaultGetParams.timeout);
	
	
	this.http_request.onreadystatechange = function() {
		aPhrase.onreadystatechange();
	}
	
}

AjaxPhrases.prototype._urlEncode = function() {
	obj = this.currentQuery.data;
	if(typeof obj != 'object') {
		throw("AjaxPhrases._urlEncode: parametr must by an object");
	}
	var uri = new String();
	
	for(var item in obj) {
		uri += encodeURIComponent(item) + '=' + encodeURIComponent(obj[item]) + '&';
	}
	
	return this.defaultGetParams.script + '?' + uri;
}

AjaxPhrases.prototype.onreadystatechange = function() {
	
	switch(this.http_request.readyState) {
		case 0: 
			this._onNoInicjalized();
		break;
		
		case 1:
			this._onLoading();
					
		break;
		
		case 2:
			this._onLoaded();	
		break;
		
		case 3: 
			this._onInteractive();
		break;
		
		case 4:
			//alert(this.http_request.status);
		 	this._onComplete();
		break;
		
		default:
			throw("redyState has got unknown value: " + this.http_request.readyState);
		break;
		
	}
}

AjaxPhrases.prototype._onNoInicjalized = function() {
	
}

AjaxPhrases.prototype._onLoading = function() {
	
}

AjaxPhrases.prototype._onLoaded = function() {
	
}

AjaxPhrases.prototype._onInteractive = function() {
	
}

AjaxPhrases.prototype._onComplete = function() {
	window.clearTimeout(this._timeout_id);
	switch(this.http_request.status) {
		case 200:
			if(this.currentQuery.params.onComplete) {
				//alert("calling on complete");
				if(this.defaultGetParams.returnXML) 
					this.currentQuery.params.onComplete(this.http_request.responseXML);
				else 
					this.currentQuery.params.onComplete(this.http_request.responseText);
			}
			if(this.currentQuery.params.onCompleteParsed) {
				//
				
			}
					
		break;
		
		default:
			throw("Server error. Status: " + this.http_request.status);
		break;
		
		
	}
}


AjaxPhrases.prototype._onTimeOut = function() {
	if(this.currentQuery.params.onError) {
		this.currentQuery.params.onError(-1, "Time Out");
	}
	
}

AjaxPhrases.prototype._onError = function() {
	if(this.currentQuery.params.onError) {
		this.currentQuery.params.onError(this.http_request.status, this.http_request.statusText);
	}
}



// Obsługa xml listy 
function PhrasesList(xDoc) {
	this.islist = false;
	
	for(var i=0; xDoc.childNodes; i++) {
		if(xDoc.childNodes[i].nodeType==1 && xDoc.childNodes[i].nodeName=='list') {
			var nList = xDoc.childNodes[i];
			this.islist = true;
			break;
		}
	}
	
	if(!nList) {
		throw("xmlList2Option: no list elements");
		return 1; // No List element
	}
	
	this.nodeList = nList;
	this.itemsNumber = nList.getAttribute('items');
	
	if(this.itemsNumbers == '0') {
		return 2; // List is empty
	}				
		
}

PhrasesList.prototype.getNthItem = function(n) {
	if(n >= this.itemsNumber) {
		throw("PhrasesList:getNthItem no suche item. ItemsNumber: " + this.itemNumber + ", param: " + n);
		return false;
	}
	
	var items = this.nodeList.getElementsByTagName("item");
	if(!items) {
		throw("PhrasesList:getNthItem no items: ");
		return false;
	}
	
	for(var i=0; i<items.length; i++) {
		if(items[i].getAttribute("id") == n) {
			var prog=items[i].getElementsByTagName('prog');
			var phrase = items[i].getElementsByTagName('phrase');
			var value = items[i].getElementsByTagName('value');
			var src = items[i].getAttribute('src');
			return {
				"prog": 	prog[0].childNodes[0].nodeValue,
				"phrase":	phrase[0].childNodes[0].nodeValue,
				"src":		src,
				"value": 	( value[0] ? value[0].childNodes[0].nodeValue : '')
			};
		}
	}
	
	return false;
	
						
} 

function xmlList2Option(xList, oSel) {
	
	var list = new PhrasesList(xList);
	
	if(!list.islist || list.itemsNumber==0 ) {
		if(oSel.hide) oSel.hide();
		return 0;
	} else {
		if(oSel.hide) oSel.show();
	}
	
	// Clear oSel	
	
	while(oSel.select.options[0]) {
		oSel.select.removeChild(oSel.select.options[0]);		
	}  
	
	for(var i=0; i<list.itemsNumber; i++) {
		var ldata = list.getNthItem(i);
		
		var opt = document.createElement("OPTION");
		var node = document.createTextNode(ldata.phrase);
		opt.value = ldata.prog;
		oSel.select.appendChild(opt);
		opt.appendChild(node);
		
	}
	
	if(oSel.complete) oSel.complete();
	
	
	//var oNewSel = document.createElement("SELECT");	
}

function xmlList2Experiences(xList, oPar) {
	
	var list = new PhrasesList(xList);	
		
	// Clear table 
	while(oPar.table.rows.length>1) {
		oPar.table.deleteRow(0);
	}
	
	for(var i=0; i<list.itemsNumber; i++) {
		var ldata = list.getNthItem(i);
		var row = oPar.table.insertRow(i);
		row.className = "ln_" + (i%2+1);
		var cell = row.insertCell(-1);
		var cBox = document.createElement("INPUT");
		cBox.type = "checkbox";
			
		cBox.name = oPar.FormName + '[characters_' + ldata.prog + ']';
		if(ldata.value == '1') cBox.checked = true;
		cell.appendChild(cBox);
		
		
		var cell = row.insertCell(-1);
		var node = document.createTextNode(ldata.phrase);
		
		cell.appendChild(node);
		cell.className = ldata.src == 'user' ? "mark" : "";
	}		
}



