/**
 * Sorter Service
 */
ponte.Classes.TableSorter = {
    _sorters: Array(),
    _sortableClass: ponte.Config.getParam("sortable_table_class"),
    _nonsortableClass: ponte.Config.getParam("non_sortable_table_class"),
    _upOrderImagePath: ponte.Config.getParam("up_order_image_path"),
    _downOrderImagePath: ponte.Config.getParam("down_order_image_path"),
    _nonOrderImagePath: ponte.Config.getParam("non_order_image_path"),
    _arrowClass: ponte.Config.getParam("arrow_class"),
    _nonsortableCellClass: ponte.Config.getParam("nonsortable_cell"),
    _headerClass : "sortheader",
    _defaultOrderClass : ponte.Config.getParam("default_order_class"),
    
    init: function(node){
        //	a frissites miatt ellenorizzuk, a nem letezo tablakat eltavolitjuk
        sorterID = null;
        if ((node.id) && (node.id.length > 0)) {
            for (s = 0; s < this._sorters.length; s++) {
                if (this._sorters[s]._ownerID == node.id) {
                    //alert("oszlop: " + this._sorters[s]._orderCol + "\nirány: " + this._sorters[s]._isReverse);
                    sorterID = s;
                    break;
                }
            }
        }
        
        tables = node.getElementsByTagName("TABLE");
        for (tc = 0; tc < tables.length; tc++) {
			tbl = tables[tc];
			if ((tbl.className.indexOf(this._sortableClass) > -1) && (tbl.className.indexOf(this._nonsortableClass) == -1)) {
				n_sorter = new ponte.Classes.TableSorter.Sorter();
				n_sorter.init(tbl, sorterID);
				// ha kozbe frissitve lett a portlet akkor felul irjuk, kulonben ujat hozunk letre
				if (sorterID != null) {
					// ujra rendezzuk
					n_sorter.orderBy(this._sorters[sorterID]._orderCol, this._sorters[sorterID]._isReverse);
					this._sorters[sorterID] = n_sorter;
				}
				else 
					this._sorters.push(n_sorter);
			}
		} 
    }
    
}


/**
 * Sorter osztaly
 */
ponte.Classes.TableSorter.Sorter = function(){
    return {
        _table: null, //		tabla node
        _orderCol: null, //		oszlop id, ami szerint rendezve van
        _firstRow: null, //		a tabla eslo sora avgy header-e
        _firstRowID: 0, //		az elso sor id-ja, ha 0 akkor a tablanak van header-je ha 1 akkor az elso sor az
        _firstRowHTML: null, // 		csak akkor létezik ha nincs head-er je a table-nek
        _tableRows: new Array(), //		a tabla sorainak innerHTML-jét tartalmazó tömb
        _tableStruct: new Object(), //		a tabla cellainak szoveget tartalmazza, asszociativ tombben
        _isReverse: false, //		merre rendezzen, ha false akkor novekvo
        _tableCache: null, //		az atrendezett tabla kerul ebbe
        //	paros es paratlan sorok class-a
        _eventTR: null,
        _oddTR: null,
        //	a table-t tartalmazo table id-ja
        _ownerID: null,
        _linkCells : new Array(),
        _isRefreshed : null,
        
        init: function(table, sorterID){
        	this._isRefreshed = sorterID;
        	try
        	{
            this._table = table;
			//if(this._table.tBodies[0].rows.length>1)
            	this.setHeader();
            this.findParentTable();
        	}catch(e)
        	{
        		//alert(e);
        	}
        },
        
        //		Tabla inicializalo resz
        setHeader: function(){
            function copyFunction(func, arg, arg2){
                return function(){
                    func(arg, arg2);
                    return false;
                }
            }
            //	elso sor kereses
            defaultOrder=null;
            _h = this._table.tHead;
            if((_h!=null)&&(_h.rows.length>1))
            {
            	this.setMultipleHeader(_h);
            }
            else
            {
	            this._firstRow = (_h) ? _h.rows[0] : this._table.rows[0];
	            this._firstRowID = (_h) ? 0 : 1;
	            
	            for (c = 0; c < this._firstRow.cells.length; c++) {
	                div = this._firstRow.cells[c];//.getElementsByTagName("DIV")[0];
	                if(div.className.indexOf(ponte.Classes.TableSorter._nonsortableCellClass)==-1)
					{
		                if (div.firstChild != null) {
		                    text = this.getTextContent(div);
		                    //	<A> TAG
		                    _a = document.createElement("A");
		                    _a.href = "#";
		                    _a.className = ponte.Classes.TableSorter._headerClass;
		                    _a.onclick = copyFunction(this.thOnClick, c, this);
		                    //	<SPAN> TAG
		                    _span = document.createElement("SPAN");
		                    _textN = document.createTextNode(text);
		                    _span.appendChild(_textN);
		                    //<IMG>TAG
		                    _imgSpan = document.createElement("SPAN");
		                    _imgSpan.className = ponte.Classes.TableSorter._arrowClass;
		                    _img = document.createElement("IMG");
		                    _img.src = ponte.Classes.TableSorter._nonOrderImagePath;
		                    _imgSpan.appendChild(_img);
		                    
		                    _span.appendChild(_imgSpan);
		                    _a.appendChild(_span);
		                    
		                    div.innerHTML = "";
		                    div.appendChild(_a);
		                    this._linkCells.push(this._firstRow.cells[c]);
		                    if(div.className.indexOf(ponte.Classes.TableSorter._defaultOrderClass)>-1)
		                    	defaultOrder=c;
		                }
					}
					else
						 this._linkCells.push(null);
	            }
            }
            if((defaultOrder!=null)&&(this._isRefreshed==null))
            {
            	cell=this._linkCells[defaultOrder];
            	_img = cell.getElementsByTagName("IMG")[0];
				_img.src = ponte.Classes.TableSorter._upOrderImagePath;
            	this._orderCol=defaultOrder;
            }
        },
        /**
         * ha a table head-ben tobb sor szerepel, 
         * figyelembe veszi a row és cell span-okat. 
         */
        setMultipleHeader : function(header)
        {
        	function copyFunction(func, arg, arg2){
                return function(){
                    func(arg, arg2);
                    return false;
                }
            }
            
            defaultOrder=null;
            
        	_h = this._table.tHead;
			 this._firstRowID = (_h) ? 0 : 3;
			//			az elso sortol kezdve vegig megyunk a cellakon, ahol a rowspan=sorok szama az link
			//			ha a rowspan nem 0, akkor a sor szama + rowspan = kovetkezo link sor, v
			
			//	a tomb i-dik eleme tartalmazza a tablazat i-dik oszlopara mutato rendezo linket		
			//	vegigmegy az elso soron, es lekeri a rowspanjat minden nem link tr-nek
			 lnkid=0;
			 if(!_h)
			 	_h=this._table.tBodies[0];
			 	
			for(i=0; i<_h.rows[0].cells.length; i++)
			{
				cell=_h.rows[0].cells[i];
				if(cell.className.indexOf(ponte.Classes.TableSorter._nonsortableCellClass)==-1)
				{
					col=cell.colSpan;
					if(col==1)
					{
						this._linkCells.push(cell);
					}
					else if(lnkid+col<=_h.rows[2].cells.length)
					{
						//	a harmadik sorbol szedi ki a kov aktualis linkeket
						for(k=lnkid; k<lnkid+col; k++)
						{
							this._linkCells.push(_h.rows[2].cells[k]);
						}
						lnkid+=col;
					}
				}
				else
					this._linkCells.push(null);
			}
			// linkek letrehozasa
			for(c =0; c<this._linkCells.length; c++)
			{			
				div = this._linkCells[c];
				if(div!=null)
				{
	                if (div.firstChild != null) {
	                    text = this.getTextContent(div);
						//	<DIV> TAG a classok miatt
						_div = document.createElement("DIV");
						_div.className = "TableHead";
						
	                    //	<A> TAG
	                    _a = document.createElement("A");
	                    _a.href = "#";
	                    _a.className = ponte.Classes.TableSorter._headerClass;
	                    _a.onclick = copyFunction(this.thOnClick, c, this);
	                    //	<SPAN> TAG
	                    _span = document.createElement("SPAN");
	                    _textN = document.createTextNode(text);
	                    _span.appendChild(_textN);
	                    //<IMG>TAG
	                    _imgSpan = document.createElement("SPAN");
	                    _imgSpan.className = ponte.Classes.TableSorter._arrowClass;
	                    _img = document.createElement("IMG");
	                    _img.src = ponte.Classes.TableSorter._nonOrderImagePath;
	                    _imgSpan.appendChild(_img);
	                    
	                    _span.appendChild(_imgSpan);
	                    _a.appendChild(_span);
	                    
						_div.appendChild(_a);
						
	                    div.innerHTML = "";
	                    div.appendChild(_div);
	                    
	                     if(div.className.indexOf(ponte.Classes.TableSorter._defaultOrderClass)>-1)
	                    	defaultOrder=c;
	                }
				}
			}	
			
			if((defaultOrder!=null)&&(this._isRefreshed==null))
            {
            	this._orderCol=defaultOrder;
            	cell=this._linkCells[defaultOrder];
            	_img = cell.getElementsByTagName("IMG")[0];
				_img.src = ponte.Classes.TableSorter._upOrderImagePath;
            }
        },
        
        thOnClick: function(cell_id, obj){
			try{
            obj.orderBy(cell_id);
			}catch(e){}
        },
        /**
         * Tabla atrendezese a cell_id az oszlop szama ami szerint rendezunk, 
         * isReverse, a rendezes iranya.
         * @param {Object} cell_id
         * @param {Object} isReverse
         */
        orderBy: function(cell_id, isReverse){
			this._isReverse = false;
			cell=this._linkCells[cell_id];
			if (isReverse == undefined) {
			
				if ((this._orderCol != null) && (this._orderCol != cell_id)) {
					_img = this._linkCells[this._orderCol].getElementsByTagName("IMG")[0];
					_img.src = ponte.Classes.TableSorter._nonOrderImagePath;
					
					_img = cell.getElementsByTagName("IMG")[0];
					_img.src = ponte.Classes.TableSorter._upOrderImagePath;
				}
				else 
					if ((this._orderCol != null) && (this._orderCol == cell_id)) {
						_img = cell.getElementsByTagName("IMG")[0];
						_img.src = (_img.src.indexOf(ponte.Classes.TableSorter._downOrderImagePath) > -1) ? ponte.Classes.TableSorter._upOrderImagePath : ponte.Classes.TableSorter._downOrderImagePath;
						this._isReverse = true;
					}
					else {
						_img = cell.getElementsByTagName("IMG")[0];
						_img.src = ponte.Classes.TableSorter._upOrderImagePath;
					}				
			}
			else {
				if (isReverse == true) {
					_img = cell.getElementsByTagName("IMG")[0];
					_img.src = ponte.Classes.TableSorter._downOrderImagePath;
				}
				else {
					_img = cell.getElementsByTagName("IMG")[0];
					_img.src = ponte.Classes.TableSorter._upOrderImagePath;
				}
				this._isReverse = isReverse;
			}
			// ha uj oszlop szerint rendezunk, uritjuk a cache-t
			if(this._orderCol!=cell_id)
				this._tableCache=null;
			this._orderCol = cell_id;
			
			this.resortTable();
			
		},
        
        //	Rendezés
        
        resortTable: function(){
            if (this._tableRows.length == 0) 				//	tabla elemeinek feldolgozasa
                this.getTableRows();
				
			if (this._tableCache==null)						//	a kivalasztott oszlop tarolasa
			{
				this._tableCache = this._tableStruct[this._orderCol];
				comparator = ponte.Classes.TableSorter.Comparators.getComparator(this.getFirstValidData());
				this._tableCache.sort(comparator);
			}
				
            if (this._isReverse)							//	visszafele rendetes
                this._tableCache.reverse();				
				
			this.updateTable();								//	html frissitese
        },
		
		getFirstValidData : function()
		{
			text="";
			for(c=0; c<this._tableCache.length; c++)
			{
				text=this._tableCache[c]._text;
				if(text.length>0)
					break;
			}
			return text;
		},
		
		/**
		 * Updateli a tabla-t, pointerekkel dolgozik, a meglevo elemeket rendezi at a tBody-ba
		 */
		updateTable : function()
		{
			sort_start=0;
			// ha az elso sor a header
            if (this._firstRowID != 0)
            { 
                this._table.tBodies[0].appendChild(this._firstRow);
                sort_start=1;
            }

            for (r = sort_start; r < this._tableRows.length+sort_start; r++) {
                id = this._tableCache[r-sort_start]._id - this._firstRowID;
                row = this._tableRows[id];
                 if (id % 2 == 0) {
				 	if (r % 2 != 0) 
				 		row.className = this._evenTR;
				 	else
				 		row.className = this._oddTR;
				 }
				 else {
				 	if (r % 2 == 0) 
				 		row.className = this._oddTR;
				 	else
				 		row.className = this._evenTR;
				 }
				 this._table.tBodies[0].appendChild(row);
            }
		},
		
        //	Letarolja a tabla cellainak szoveget es a sorok innerHTML-jet
        getTableRows: function(){
            _tBody = this._table.tBodies[0];
            
            //	struct tabla inicializalasa
            for (c = 0; c < _tBody.rows[0].cells.length; c++) {
                this._tableStruct[c] = new Array();
            }
            //	struct tabla feltoltese
            for (r = this._firstRowID; r < _tBody.rows.length; r++) {
                row = _tBody.rows[r];
                if (row.innerHTML != undefined) {
                    this._tableRows.push(row);
                    for (c = 0; c < _tBody.rows[r].cells.length; c++) {
                        this._tableStruct[c].push(new ponte.Classes.TableSorter.Comparable(r, this.getTextContent(_tBody.rows[r].cells[c])));
                    }
                }
            }
            //	paros- paratlan sorok class-ainak tarolasa
            this._oddTR = _tBody.rows[this._firstRowID].className;
            this._evenTR = _tBody.rows[this._firstRowID+1].className;
        },
        
        _getTextContent: function(node){
            if (typeof node == "string") 
                return node;
            else 
                if (typeof node == "undefined") 
                    return node;
            
            str = "";
            
            for (n=0; n<node.childNodes.length; n++) {
                switch (node.childNodes[n].nodeType) {
                    case 1:{//ELEMENT_NODE
                        str += this.getTextContent(node.childNodes[n]);
                        break;
                    }
                    case 3:{//TEXT_NODE
                        t = node.childNodes[n].nodeValue;
                        if (t != '\n') 
                            str += node.childNodes[n].nodeValue;
                        break;
                    }
                }
            }
            return str;
        },
        
        getTextContent : function(el)
        {
        	if (typeof el == "string") return el;
			if (typeof el == "undefined") { return el };
			if (el.innerText) return el.innerText;	//Not needed but it is faster
			var str = "";
			
			var cs = el.childNodes;
			var l = cs.length;
			for (var i = 0; i < l; i++) {
				switch (cs[i].nodeType) {
					case 1: {//ELEMENT_NODE
						str += this.getTextContent(cs[i]);
						break;}
					case 3:	{//TEXT_NODE
						str += cs[i].nodeValue;
						break;}
				}
			}
			return str;
        },
        
        //	Megkeresi a parent table-k kozott, az elsot amelyiknek van ID-ja
        findParentTable: function(){
            id = "";
            node = this._table;
            while ((id.length == 0) && (node.offsetParent)) {
                node = node.offsetParent;
                id = node.id;
            }
            this._ownerID = id;
        }
    }
}

/**
 * Tipus komparatorok
 */
ponte.Classes.TableSorter.Comparators = {
    getComparator: function(field){
		field=field.replace(/[^-?0-9?A-Za-z\.,:]/g,"");
        comparator = this.stringComparator;
        if (ponte.Classes.TableSorter.lang == "HUN") {
            if (field.match(/^[-\d\s,.]+$/)) {
                comparator = this.hun_numericComparator;
            }
            if (field.match(/\d\d\d\d[\.]\d\d[\.]\d\d/)) {
                comparator = this.hun_dateComparator;
            }
            if (field.match(/\d\d[\:]\d\d/)) {
                comparator = this.hun_dateComparator;
            }
        }
        else {
            if (field.match(/^[-\d\s,]+$/)) {
                comparator = this.eng_numericComparator;
            }
            if (field.match(/\d\d[\.]\d\d[\.]\d\d\d\d/)) 
                comparator = this.eng_dateComparator;
            if (field.match(/\d\d[\:]\d\d/)) 
                comparator = this.eng_dateComparator;
           
        }
        
        return comparator;
    },
    
    stringComparator: function(a, b){
        if (a._text == b._text) 
            return 0;
        if (a._text < b._text) 
            return -1;
        return 1;
    },
    
    hun_numericComparator: function(a, b){
    	if(a._text.length==0) return -1;
    	if(b._text.length==0) return 1; 
    	a = a._text.replace(/[^-?0-9\.\,]/g, '');
        a = parseFloat(a.replace(/[^-?0-9\.]/g, '.'));
        b = b._text.replace(/[^-?0-9\.\,]/g, '');
        b = parseFloat(b.replace(/[^-?0-9\.]/g, '.'));
        if (a == b) 
            return 0;
        if (a < b) 
            return -1;
        return 1;
    },
    /**
     * Vesszo az 1000-es valto, . a tizedes
     * @param {Object} a
     * @param {Object} b
     */
    eng_numericComparator: function(a, b){
    	if(a._text.length==0) return -1;
    	if(b._text.length==0) return 1; 
    	a = a._text.replace(/[^-?0-9\.\,]/g, '');
        a = parseFloat(a.replace(/[^-?0-9\.]/g, ''));
        b = b._text.replace(/[^-?0-9\.\,]/g, '');
        b = parseFloat(b.replace(/[^-?0-9\.]/g, ''));
        if (a == b) 
            return 0;
        if (a < b) 
            return -1;
        return 1;
    },
    /**
     * Vesszo a tizedes elválaszto, azt cserelni kell .-ra
     * @param {Object} a
     * @param {Object} b
     */
    hun_dateComparator: function(a, b){
    	if(a._text.length==0) return -1;
    	if(b._text.length==0) return 1; 
    	
    	if(a._text.length == 5)
    	{
    		if(b._text.length>5)
    			return 1;
    		a = a._text.split(":");
    		a = a[0]+a[1];
    		a = parseFloat(a);
    	}
    	else
    	{
    		if(b._text.length==5)
    			return -1;
	        a = a._text.split(".");
	         if((a.length==3)||(a.length==4))
	        	a=a[0]+a[1]+a[2];
	        else
	        	a="10" + a[0].replace(/[^-?0-9]/g, '');
	        a=parseFloat(a);
    	}
    	
    	if(b._text.length == 5)
    	{
    		b = b._text.split(":");
    		b = b[0]+b[1];
    		b = parseFloat(b);
    	}
    	else
    	{
	        b = b._text.split(".");
	         if((b.length==3)||(b.length==4))
		        b=b[0]+b[1]+b[2];
	        else
	        	b="10"+ b[0].replace(/[^-?0-9]/g, '');
	 		b=parseFloat(b);
    	}
 		       	
        if (a == b) 
            return 0;
        if (a < b) 
            return -1;
        return 1;
    },
    
    eng_dateComparator: function(a, b){
    	if(a._text.length==0) return -1;
    	if(b._text.length==0) return 1; 
    	// lehet hogy ido formatum pl:. 12:35
    	if(a._text.length == 5)
    	{
    		if(b._text.length>5)
    			return 1;
    		a = a._text.split(":");
    		a = a[0]+a[1];
    		a = parseFloat(a);
    	}
    	else
    	{
    		if(b._text.length==5)
    			return -1;
	        a = a._text.split(".");
	        if((a.length==3)||(a.length==4))
	        	a=a[2]+a[1]+a[0];
	        else
	        	a="10" + a[0].replace(/[^-?0-9]/g, '');
	        a=parseFloat(a);
    	}
        
        if(b._text.length == 5)
    	{
    		b = b._text.split(":");
    		b = b[0]+b[1];
    		b = parseFloat(b);
    	}
    	else
    	{
	        b = b._text.split(".");
	        if((b.length==3)||(b.length==4))
		        b=b[2]+b[1]+b[0];
	        else
	        	b="10"+ b[0].replace(/[^-?0-9]/g, '');
	 		b=parseFloat(b);
    	}
        if (a == b) 
            return 0;
        if (a < b) 
            return -1;
        return 1;
    }
}
/**
 * Egy cellat tarolo objektum
 */
ponte.Classes.TableSorter.Comparable = function(id, text){
    return {
        _id: id,
		//	space-ket eltavolitjuk
        _text: text.replace(/[^-?0-9?A-Za-z\.,:]/g,"")
    }
}

/**
 * Ajax portlet frissito callback fuggvenye
 */
ponte.Classes.TableSorter.refreshCallback = function(_id){
    // ujra inicializaljuk a tablakat, de csak ezen a portleten belul
    node = document.getElementById(_id);
    if (node != null) {
        ponte.Classes.TableSorter.init(node);
    }
}

// LoadEvent
ponte.Classes.TableSorter.lang = "ENG";document.getElementById("variant_link")
ponte.Classes.TableSorter.loadEvent = function(){

    try {
        ponte.Classes.TableSorter.init(document);
    } 
    catch (e) {
        //alert(e);
    }
    
    
    //	portlet frissitesnel ujra rendezze, ezert tarsitunk egy callback fuggvenyt
    
    try {
        ponte.Classes.PortletRefresher.addReadyCallback(ponte.Classes.TableSorter.refreshCallback);
    } 
    catch (e) {
        //alert(e);
    }
    
    
    
    
    
    //	bet specko sor a nyelv meghatarozashoz
    l = document.getElementById("variant_link_type");
    if ((l != null) && (l.value.indexOf(".english") > -1)) 
        ponte.Classes.TableSorter.lang = "HUN";
    else if(l!=null)
    	ponte.Classes.TableSorter.lang = "ENG";
    else
    	ponte.Classes.TableSorter.lang = "HUN";
    
    
    
}
addLoadEvent(ponte.Classes.TableSorter.loadEvent);
