var currentClient = null;
var currentList = null;
var oldClient = null;
var busy = 0;

var Tables = new Array();


function trim(str, chars) {
    str = str ? (str+'') : '';
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}	
					
var EditList = Class.create();
EditList.prototype = 
{
    initialize: function(handle, htmltable, htmlsidebar, htmlform) 
    {
	this.handle = handle, 
	this.htmltable = htmltable;
	this.htmlsidebar = htmlsidebar;
	this.htmlform = htmlform;
	this.serviceURL = 'http://padmin.dojazd.pl/common/services/editlist_s.php';
	this.items = new Array();
	// inicjalizacja elementów
	var list = htmltable.getElementsByTagName("TR");
	for (var i = 0; i<list.length; i++) 
	    {
		var c = list[i];
		if (!c.getAttribute('m_id')) continue;
		this.items.push(new Client(this, c, { id: c.getAttribute('m_id') }, true));
	    }
	this.activerow = null;
    },
    _updateData: function(aClient, func, onComplete, inBackground) 
    {
	if (func==null) d('Unknown function!');
	aClient.disable();
	s  = "operations[0][handle]=" + encodeURIComponent(this.handle+"") + "&";
	s += "operations[0][function]=" + encodeURIComponent(func+"") + "&";
	s += aClient.serialize(0);
	document.lastRequest = new Ajax.Request(
						this.serviceURL, {
						    onFailure: function() 
						    {
							alert(func+' failed');
						    },
				
						    onComplete: function(a, b) 
						    {
							//						d(a.responseText);

							var client = b.options.client;
							var list = a.responseXML.childNodes[0].getElementsByTagName('OPERATION');

							var er = getXMLValue(list[0], 'ERROR');
							if (er) {
							    infoBox('Error: '+er, client.row);
							    //							d(er);
							    return;
							}
	
							var func = getXMLValue(list[0], 'FUNCTION');
							if (func == 'add') {	
							    infoBox('Added', client.row);
							} else if (func == 'delete') {	
							    infoBox('Deleted', client.row);
							    client.deleteRow();
							    return; 
							}					

							client._fromXML(list[0]);
							client._toTR();
							client.enable(b.options.inBackground);
							if (!b.options.inBackground) {
							    b.options.client._toForm($('sbEdit_form'));
							}
							if (b.options.doOnComplete)
							    b.options.doOnComplete();
						    },
						    method: 'get', asynchronous: true, 
						    parameters: s,
						    client: aClient,
						    doOnComplete: onComplete,
						    inBackground: inBackground
						});
    },
        
    deleteSelected: function() 
    {
	var list = $(this.htmltable).getElementsByTagName("INPUT");
	for (var i = 0; i<list.length; i++) 
	    {
		if (!list[i].checked) continue;
		var c = list[i].parentNode.parentNode.client;
		if (c == currentClient) 
		    {
			sbEdit.doClose();
			currentClient = null;
		    }
		this.items.removeItem(c);
		if (c) c.deleteD();
	    }
    }	

    // EditList ENDS here
}

    function deleteSelected() 
{
    if (currentClient != null)
	if (currentClient.myEditList != null) 
	    currentClient.myEditList.deleteSelected();
}

var Client = Class.create();
Client.prototype = 
{
    initialize: function(aEditList, row, data, load) 
    {
	this.myEditList = aEditList; 
	this.row = row;
	this.enabled = true;
	this.data = data || { id: {value: -1, text: -1, } };
	if (load && row) 
	    {
		this._initRow();
		this._fromTR();
	    } //else
	//	assert(typeof(this.data.id)=="undefined");
    },
        
    _toTR: function() {
	var list = new Array();
	list.pushA(this.row.getElementsByTagName("TD"));
	for (var f in this.data)
	    for (var i = 0; i<list.length; i++) {
		var c = list[i];
		if (c.getAttribute("m_field")==f) {
		    c.innerHTML = this.data[f].text;
		    c.setAttribute("m_value", this.data[f].value);
		}
	    }
    },
        
    _fromTR: function() {
	var list = new Array();
	list.pushA(this.row.getElementsByTagName("TD"));
	//			dO(this.data);
	for (var i = 0; i<list.length; i++) {
	    var c = list[i];
	    if (c && c.getAttribute("m_field") && c.getAttribute("m_value")) {
		this.data[c.getAttribute("m_field")] = { 
		    value: c.getAttribute("m_value"),
		    text: c.innerHTML };
		//					c.setAttribute("m_value", this.data[f]);
	    }
	}
    },
        
    _toForm: function(frm) {
	var list = new Array();
	list.pushA(frm.getElementsByTagName("INPUT"));
	list.pushA(frm.getElementsByTagName("TEXTAREA"));
	list.pushA(frm.getElementsByTagName("SELECT"));
	for (var f in this.data)
	    for (var i = 0; i<list.length; i++) {
		var c = list[i];
		if (c.getAttribute("m_field")==f) {
		    if (c.tagName.toLowerCase() == 'select') {
			var opts = c.getElementsByTagName("OPTION");
			var opt = undefined;
			for (var x = 0; x < opts.length; x++) {
			    if (opts[x].getAttribute('value') == trim(this.data[f].value)) {
				opt = opts[x];
				break;
			    }
			}
			if (!opt) {
			    opt = document.createElement('option');
			    opt.setAttribute('value', trim(this.data[f].value));
			    opt.appendChild(document.createTextNode(trim(this.data[f].value)));
			    c.appendChild(opt);
			}
		    }
		    if (c.text) c.text = trim(this.data[f].text);
		    c.value = trim(this.data[f].value);
		}
	    }
    },
        
    _fromXML: function(a) {
	var xml = a;
	for (var i = 0; i<xml.childNodes.length; i++) {
	    var c = xml.childNodes[i];
	    var str = new String((c.firstChild)?c.firstChild.nodeValue:"");
	    //				alert(typeof(str));
	    var ar = str.split('|');
	    //				dO(ar);
	    if (!ar[1]) ar[1] = ar[0];
	    var name = c.nodeName.toLowerCase(); 
	    this.data[name] = { value: ar[0], text: ar[1] };
	}
    },
        
    _fromForm: function(frm) {
	var list = new Array();
	list.pushA(frm.getElementsByTagName("INPUT"));
	list.pushA(frm.getElementsByTagName("TEXTAREA"));
	for (var i = 0; i<list.length; i++) {
	    var c = list[i];
	    if (c && c.getAttribute("m_field")) {
		this.data[c.getAttribute("m_field")] =  { 
		    text: c.value,
		    value: c.value };
	    }
	}
	var list = new Array();
	list.pushA(frm.getElementsByTagName("SELECT"));
	for (var i = 0; i<list.length; i++) {
	    var c = list[i];
	    if (c && c.getAttribute("m_field")) {
		this.data[c.getAttribute("m_field")] =  { 
		    text: c.options[c.selectedIndex].text,
		    value: c.value };
		//					dO(this.data[c.getAttribute("m_field")]);
	    }
	}
	//        	for (var f in this.data)
	//				dO(this.data[f]);
    },

    serialize: function(index) {
	var s = "";
	if (!index) index = 0;
	ar = this.data;
	for (var p in ar) {
	    try {
		if (typeof(ar[p])=="function") continue;
		if (typeof(ar[p])=="array") {
		    var ar = ar[p];
		    for (var i in ar) {
			s += "operations["+ index + "][args][" + i + "][]=" + encodeURIComponent(ar[p]+"") + "&";
		    }
		    continue;
		}
		//					s += "operations["+ index + "][args][" + p + "]=" + encodeURIComponent(ar[p].value+"|"+ar[p].text+"") + "&";
		s += "operations["+ index + "][args][" + p + "]=" + encodeURIComponent(ar[p].value+"") + "&";
	    } catch (e) {
		d('Exception!\n'+e);
	    }
	}
	//			alert(s);
	return s;
    },
    /*        
        
	      serialize: function() 
	      {
	      var s = "";
	      for (var f in this.data) {
	      if (typeof(this.data[f])!="function")
	      s += f+"="+encodeURIComponent(this.data[f])+"&";
	      }
	      return s;
	      },
    */
    _initRow: function() {
	if (this.row) {
	    this.row.client = this;
	    //        		this.row.m_disable = function () { this.client.disable(); };
	    //        		this.row.m_enable = function () { this.client.enable(); };
	}
    },
        
    createRow: function(table) {
	this.row = $('sampleRow').cloneNode(true);
	this.row.setAttribute("id", "");
	this.row.style.display = "";
	this._initRow();

	if (table.firstChild && table.firstChild.tagName && table.firstChild.tagName.toUpperCase()=='TBODY')
	    table.firstChild.appendChild(this.row);
	else	table.appendChild(this.row);
	this.disable();
    },
        
    markRow: function() {
	if (this.enabled)
	    this.row.style.backgroundColor = '#BBBBBB';			
	else
	    this.row.style.backgroundColor = '#FFBBBB';
    },
        
    unMarkRow: function() {
	if (this.enabled)
	    this.row.style.backgroundColor = '';			
	else
	    this.row.style.backgroundColor = '#FFBBBB';
    },
        
    add: function (f) {
	//        	d('Adding...');
	//			this._updateData('add', f);
	this.myEditList._updateData(this, 'add', f);
    },
        
    save: function (f) {
	//			this._updateData('save', f);
	this.myEditList._updateData(this, 'save', f);
    },
        
    geocode: function (f, inBackground) {
	this.myEditList._updateData(this, 'geocode', f, inBackground);
    },
        
    disable: function () {
	var tmp = this.row.getElementsByTagName("TD");
	tmp[tmp.length-1].innerHTML = '<img src="/common/imgs/load.gif" />';
	this.enabled = false;
	this.markRow();
    },
        
    enable: function(unmark) {
	var tmp = this.row.getElementsByTagName("TD");
	tmp[tmp.length-1].innerHTML = '';
	this.enabled = true;
	if (!unmark) 
	    this.markRow();
	else 
	    this.unMarkRow();
    },
        
    deleteD: function(f) {
	this.myEditList._updateData(this, 'delete', f);
    },
        
    deleteRow: function() {
	this.row.parentNode.removeChild(this.row);
    }
}
	
    function fillSB() {
	if (currentClient) {
	    currentClient.markRow();			
	    $('sbEdit_form').reset();
	    currentClient._toForm($('sbEdit_form'));
	} else {
	    currentClient = new Client(activeList, null, { id: { text: "Nowy", value: -1} });		
	    $('sbEdit_form').reset();
	    currentClient._toForm($('sbEdit_form'));
	}
	if ($('mailTemplateInfo'))
	    $('mailTemplateInfo').innerHTML = '';
	/*! Ugly hack! */
	//		if ($('btnShowOnMap'))
	//        	$('btnShowOnMap').disabled = currentClient.data['geocoded'].text=="nie";
	//        if ($('hfNext'))
	//			$('hfNext').value = currentClient.data['id'];
	//		d('Opening sbEdit');
	sbEdit.doOpen(/* showImg */);
    }
	
function edit(t) {
    if (sbEdit.busy) 
	{
	    //			d('function edit(t) : row is busy!');
	    return;
	}
    var oldClient = currentClient;
    if (oldClient && oldClient.row)
	oldClient.unMarkRow();

    if (t!==null) {
	var c = t.client;
	if (!c) return;
	if (c && !c.enabled) return;
	currentClient = c;
    } else
	currentClient = null;


    if (sbEdit.opened && currentClient!==oldClient)
	sbEdit.doClose( function() { 
		//				sbMap.doClose(); 
		//				$('imgMap').src = 'imgs/pixel.gif';
		fillSB(); 
		//				d('t_active value : '+currentClient.data['is_payed']);
	    } );
    else
	fillSB();
}
	
function geocodeSelected() {
    var list = $('tblList').getElementsByTagName("INPUT");
    for (var i = 0; i<list.length; i++) {
	if (!list[i].checked) continue;
	var c = list[i].parentNode.parentNode.client;
	if (c) c.geocode(null, (currentClient!=c));
    }
}

	
function checkAll(c) {
    var list = $('tblList').getElementsByTagName("INPUT");
    for (var i = 0; i<list.length; i++) {
	if (list[i].type!="checkbox") continue;
	list[i].checked = c;
    }
}
	
function prepareTable(aEditList) 
{
    Tables[aEditList] = new EditList(aEditList, $('tblList'), $('sbEdit'), $('sbEdit_form'));
    activeList = Tables[aEditList];
}
	
function save(onDone) {
    /*	
	var frm = $('sbEdit_form');
       	var list = new Array();
       	list.pushA(frm.getElementsByTagName("INPUT"));
       	list.pushA(frm.getElementsByTagName("TEXTAREA"));
       	list.pushA(frm.getElementsByTagName("SELECT"));
	var b = true;
       	for (var i = 0; i<list.length; i++) {
	var c = list[i];
	if (c.getAttribute("m_validate"))
	b = b && validate(c, c.getAttribute('m_validate'));
	}
		
	if (!b) return;
    */		
    if (!currentClient) return;
    if (currentClient.data.id.value!=-1) 
	{
	    currentClient._fromForm($('sbEdit_form'));
	    currentClient.img = null;
	    currentClient.save(onDone);
	}else 
	{
	    currentClient = new Client(activeList, null, { id: { text: "Nowy", value: -1} });
	    currentClient._fromForm($('sbEdit_form'));
	    currentClient.createRow($('tblList'));
	    currentClient.row.onclick = function () { edit(this); };
	    currentClient.add(onDone);
	}
}
	
function deleteRow() {
    if (!currentClient || !currentClient.row) return;
    sbEdit.doClose();
    currentClient.deleteD();
    currentClient = null;
}
	
function changeBase(s)
{
    if (!currentClient) return;
    if (currentClient.data.id.value!=-1)
	{
            if ($('hfNext'))
		$('hfNext').value = currentClient.data.id.value;
	    $('sbNext').action = s;
	    $('sbNext').submit();
	}
}
	
function validate(element, teststring) {
    var regex = new RegExp(teststring);
    if (!regex.test(element.value)) {
	//			alert('Wprowadzono złą wartość\n');
	element.focus();
	element.style.backgroundColor = 'red';
	infoBox('Wprowadzono złą wartość', element);
	if ($('btnOk'))
	    $('btnOk').disabled = true;
	return false;
    } else {
	element.style.backgroundColor = '';
	if ($('btnOk'))
	    $('btnOk').disabled = false;
	return true;
    }
}

