var XMLNodeNamePageType = "pageType";
var XMLNodeNameError = "errors";
var XMLNodeNameErrMsg = "message";
var XMLNodeNameDataGrid = "grid";
var XMLNodeNameColumns = "columnList";
var XMLNodeNameWidthList = "widthList";
var XMLNodeNameFormatList = "formatList";
var XMLNodeNameRowNum = "row_num";
var XMLNodeNamePageSize = "page_size";
var XMLNodeNamePageNum = "page_num";
var XMLNodeNameRecordCount = "record_count";
var XMLNodeNameDataList = "dataList";
var XMLNodeNameRow = "row";
var XMLNodeNameField = "field";

var PageTypeHtml = "HTML";
var PageTypeXML = "XML";

var createNumArray = function(num) {
	var a = new Array;
	var isZero = arguments.length > 1 ? true : false;
	for(var i = 0; i < num; i ++) {
		if (isZero)
			a.push(0);
		else
			a.push(i);
	}
	return a;
}

var AWObjectLib = {
	createTabs : function() {
		var id = "";
		var tabs = [];
		if (arguments.length > 0) id = arguments[0];
		if (arguments.length > 1) tabs = arguments[1];
		var o = new AW.UI.Tabs;
		o.setId(id);
		o.setItemText(tabs);
		o.setItemCount(tabs.length);
		if (arguments.length > 2) {
			o.setSelectedItems([arguments[2]]);
		}
		o.tabStatus = createNumArray(tabs.length, true);
		/*o.onCurrentItemChanged = function(i) {
			alert(this.getSelectedItems());
		}*/
		return o;
	},
	
	createButton : function() {
		var id = "";
		var text = "";
		if (arguments.length > 0) id = arguments[0];
		if (arguments.length > 1) text = arguments[1];
		var o = new AW.UI.Button;
		o.setId(id);
		o.setControlText(text);
		o.isButtonDisable = function() {
			if (this.getAttribute("disabled")) return true; 
			this.setAttribute("disabled", true);
			this.refresh();
			return false;
		}
		
		o.setButtonEnable = function() {
			this.setAttribute("disabled", false);
			this.refresh();
		}
		
		if (arguments.length > 2) o.onClick = arguments[2];
		return o;
	},
	
	createCheckBox : function() {
		var id = "";
		var text = "";
		var c = null;
		if (arguments.length > 0) id = arguments[0];
		if (arguments.length > 1) text = arguments[1];
		
		var o = new AW.UI.Checkbox;
		o.setId(id);
		o.setControlText(text);
		if (arguments.length > 2) 
			o.objectCtrl = arguments[2];
		else
			o.objectCtrl = null;
		
		o.onControlValueChanged = function(checked) {
			if (this.objectCtrl.constructor == AW.UI.Grid.prototype.constructor) {
				if (checked)
					this.objectCtrl.setSelectedRows(createNumArray(this.objectCtrl._rowCount));
    			else
					this.objectCtrl.setSelectedRows(new Array());
			}
		}
		return o;
	},
	
	createGrid : function() {
		var id = "";
		if (arguments.length > 0) id = arguments[0];
		var o = new AW.UI.Grid;
		o.setId(id);
		o.setSelectionMode("multi-row"); 
		o.setSelectorVisible(true); 
		o.setSelectorWidth(24); 
		o.setSelectorTemplate(new AW.Templates.CheckedItem); 
		o.onRowSelectedChanged = function(value, i){ 
			this.getSelectorTemplate(i).refresh(); 
		}
		return o;
	}
}

function getXMLElement(element, name) {
    var i = 0;
    if (arguments.length > 2) i = arguments[2];
	try {
	    var items = element.getElementsByTagName(name);
	    if (items != null && items.length > i) 
		    return element.getElementsByTagName(name)[i];
	}
	catch(ex) {
		return null;
	}
}

function getXMLValue(element, name, df) {
	var v = null;
	try {
	    var items = element.getElementsByTagName(name);
	    if (items != null && items.length > 0) 
		    v = items[0].firstChild.nodeValue;
	}
	catch(ex) {
		v = df;
	}
	if (v == null) v = df;
	return v;
}

function getDataFromXML(element) {
	datas = [];
	if (element == null) return datas;
	var rows = element.getElementsByTagName(XMLNodeNameRow);
	if (rows.length > 0) {
		for(var i = 0; i < rows.length; i ++) {
			var r = [];
			var fields = rows[i].getElementsByTagName(XMLNodeNameField);
			for(var j = 0; j < fields.length; j++) {
				var l = r.length;
				try {
					r[l] = fields[j].firstChild.nodeValue;
				}
				catch(e) {
					r[l] = "";
				}
			}
			datas[datas.length] = r;
		}
	}
	return datas;
}

function AWCtrl(transport) {
	this.pageType = getXMLValue(transport.responseXML, XMLNodeNamePageType, PageTypeHtml);
	
	this.pageContent = "";
	this.gridCtrl = null;
	this.errors = null;
	
	if (this.pageType == PageTypeHtml) {
		this.pageContent = transport.responseText;
	} else {
		var datas = getXMLElement(transport.responseXML, XMLNodeNameDataGrid);
		if (datas != null) this.gridCtrl = new AWGridCtrl(datas);
		var errs = getXMLElement(transport.responseXML, XMLNodeNameError);
		if (errs != null) this.errors = new AWErrorsCtrl(errs);
	}
	
	this.updateGrid = function(grid) {
		if (this.gridCtrl != null) this.gridCtrl.updateGrid(grid);
	}
}

function AWErrorsCtrl(element) {
	this.messages = [];
	this.errorNumber = 0;
	
	var msgs = element.getElementsByTagName(XMLNodeNameErrMsg);
	if (msgs.length > 0) {
		this.errorNumber = msgs.length;
		for(var i = 0; i < msgs.length; i ++) {
			this.messages[this.messages.length] = msgs[i].firstChild.nodeValue;
		}
	}
	
	this.toString = function() {
		var value = "";
		if (this.messages.length > 0) {
			for(var i = 0; i < this.messages.length; i ++) {
				if (i > 0) value += "\n";
				value += this.messages[i];
			}
		}
		return value;
	}
	
	this.showErrors = function() {
		var container = null;
		var type = 0;
		if (arguments.length > 0) container = arguments[0];
		if (arguments.length > 1) type = arguments[1];
		if (container == null) {
			alert(this.toString());
		} else {
			container.innerText = this.toString();
		}
	}
	
}

function AWGridCtrl(element) {
	var columns = getXMLValue(element, XMLNodeNameColumns, "");
	var widths = getXMLValue(element, XMLNodeNameWidthList, "");
	var formats = getXMLValue(element, XMLNodeNameFormatList, "");
	var row_num = getXMLValue(element, XMLNodeNameRowNum, "0");
	var page_size = getXMLValue(element, XMLNodeNamePageSize, "0");
	var page_num = getXMLValue(element, XMLNodeNamePageNum, "0");
	var record_count = getXMLValue(element, XMLNodeNameRecordCount, "0");
	
	
	this.columnList = columns != null && columns != "" ? columns.split(",") : [];
	this.widthList = widths != null && widths != "" ? widths.split(",") : [];
	this.formatList = formats != null && formats != "" ? formats.split(",") : [];
	this.rowNum = parseInt(row_num);
	this.pageSize = parseInt(page_size);
	this.pageNum = parseInt(page_num);
	this.recordCount = parseInt(record_count);

	var dataXML = getXMLElement(element, XMLNodeNameDataList);

	this.gridData = getDataFromXML(dataXML);
	
	this.updateGrid = function(grid) {
		if (this.widthList.length > 0) {
			for(var i = 0; i < this.widthList.length; i ++) {
				grid.setColumnWidth(parseInt(this.widthList[i]), i); 
			}
		}
		
		if (this.formatList.length > 0) {
			var dataFormats = [];
			for(var i = 0; i < this.formatList.length; i ++) {
			    var f = null; 
				if (this.formatList[i] == "Str") dataFormats[dataFormats.length] = new AW.Formats.String;
				if (this.formatList[i] == "Num") dataFormats[dataFormats.length] = new AW.Formats.Number;
				if (f == null) f = new AW.Formats.String;
				dataFormats[dataFormats.length] = f;
			}
			grid.setCellFormat(dataFormats);
		}
		
		grid.setHeaderText(this.columnList);
		grid.setRowCount(this.rowNum);
		grid.setColumnCount(this.columnList.length);
		grid.setCellText(this.gridData);

		grid.refresh();
	}
}