/**
 * Request.implement
 * 
 * Requestfunktionen
 * Connectbereich für den Verzeichnisaufruf
 * 
 * @version		1.0
 * 
 * @author		GO4WEB Internet Agentur
 * @copyright		2010 Author
 *
 *
 * options:

	this.options._verzUser = 'dbname';
	this.options._verzTreeLayout = [{
 		layout: '<div id="sub{$i}">{$menuname}</div>'
 		,query: '{
 			
 		}'
 	}];
 	this.options._verzMainLayout = [{
 		layout: '<div>{$test}<br />{$test}<br />{$test}<br /></div>'
 		,query: '{
 			
 		}'
 	}];
 */

/**
* GO4WEBDESK - CLASS
* - Verzeichnisfunctions
*	- Requests / Mulirequest
*	- Autorubrikbuilder
*	- Requestsorter
* - DOM Prerenderer
*/
var addDeskJS = new Class({
	
	// implements
	Implements: [Options, Events]
	
	// options
	,options: {
		id: 0
		,verDebug: 0
		,verzLocal: 0
		,verzUser: '4c_testuser'
	}
	
	// initialize
	,initialize: function(options){
		this.setOptions(options);
		// this.Template = new Template();
		// console.log(this.Template);
	}
	
	// Dummy-Request auf gewälten user
	,_verzReqData: function(){
		
		this._verzReqStr = {
			type: 'all'
			,user: this.options.verzUser
			,table: {
				listingdatas: 'ld'
				,listingrows: 'lr'
				//,listings: 'l'
			}
			,condition: {
//				OR abfrage
//				0: {
//					'm.sommer': '1',
//					'm.winter':'1'
//				}
			}
			,fields: 'lr.*,ld.*'
			,order: 'ld.id DESC'
			,language: 'de'
		}
	}
	
	// Verzeichnisrequest mit Verweiss auf Folgefunktion
	,_verzReq: function(onCompletFunc){
		
		if(this.options.verzDebug == 1) debugStr = '&debug=1';
		else debugStr = '';
		
		if(!this._verzReqStr) this._verzReqData();
		
		// tempsStr
		if($defined(this._verzTempReqStr) && this._verzTempReqStr){
			reqStr = this._verzTempReqStr;
			this._verzTempReqStr = false;
		}else{
			reqStr = this._verzReqStr;
		}
		
		// Falls Arrayreq nur mit einem Element
		if(reqStr.length == 1) reqStr = reqStr[0];
		
		new Request({
			url: 'index.php'
			,method: 'post'
			,data: 'mode=verzeichnis&local=' + this.options.verzLocal + debugStr +'&request=' + encodeURIComponent(JSON.encode(reqStr))
			,noCache: true
			,onComplete: function(response){
				var req = JSON.decode(response);
				this[onCompletFunc](req);
			}.bind(this)
		}).send();
	}
	
	
	,_verReqChange: function(reqObj, changObj){
		
		var buildObj, addStr, newTbl={};
		var tblList = {listingdatas: 'ld', listingrows: 'lr', listings: 'l'};
		
		if(reqObj) buildObj = reqObj;
		else buildObj = this._verzReqStr;
		if($defined(changObj['table']) && $type(changObj['table']) == 'string'){
			if(changObj['table'] == '') addStr = '';
			else addStr = '_' + changObj['table'];
			$H(tblList).each(function(items, key){
				newTbl[key + addStr] = items;
			});
			changObj['table'] = newTbl;
		}
		$H(changObj).each(function(items, key){
			reqObj[key] = items;
		});
		
		return reqObj;
	}
	
	/**
	 * _verzFormMulti	Merg des MultiformRequest mit tableName adding
	 * 
	 * sortPath		SortPath Falls das Object nach dem Merg sortiert werden soll (siehe _verzFormSort)
	 * order		Order des Sorting
	 */
	,_verzFormMulti: function(req, sortPath, order){
		
		var newReqArr = [];
		var reqOut = [];
		var count = 0;
		
		if(!$defined(req.result[0][0])) req.result = [req.result];
		req.result.each(function(items, key){
			var tblName = req.tblName[key];
			items.each(function(subitems, subkey){
				if($defined(subitems.lr)) subitems.lr['tableName'] = tblName;
				if($defined(subitems.ld)) subitems.ld['tableName'] = tblName;
				newReqArr.push($H(subitems));
			});
			count++;
		}, this);
				
		if(sortPath) newReqArr = this._verzFormSort(newReqArr, sortPath, order);
		
		reqOut['count'] = newReqArr.length;
		reqOut['result'] = newReqArr;
		
		return reqOut;
	}
	
	/**
	 * _verzFormSort	Umsortierung eines Hash (Achtung Object muss zu Hash formatiert werden)
	 * 
	 * array		Zu sortierenden Hash
	 * path			Sortierpfad (ld.datum)
	 * order		desc / asc
	 */
	,_verzFormSort: function(array, path, order){
		
		for (var i = 0; i < array.length; i++) {
			
			var currVal = array[i].getFromPath(path);
			var currElem = array[i];
			
			var j = i - 1;
			while ((j >= 0) && (array[j].getFromPath(path) > currVal)) {
				array[j + 1] = array[j];
				j--;
			}
			array[j + 1] = currElem;
		}
		
		if(order == 'desc') array.reverse();
		
		return array;
	}
	
	/**
	 * _verzTreeBuild	Requestobjekt der Rubrik
	 * 
	 * getfrom		"all" oder id <- ab einer id abwärts
	 * level		num / Anzahl nach getfrom == 0
	 */
	,_verzTreeReq: function(getfrom, level){
		
		// db->Request
		this._verTreeBuild();
	}
	
	/**
	 * _verTreeBuild	Requestobjekt der Rubrik
	 * 
	 * getfrom		"all" oder id <- ab einer id abwärts
	 * level		num / Anzahl nach getfrom == 0
	 */
	,_verzTreeBuild: function(tree, tplOptions){
		
		if(typeof(tplOptions.target) == "undefined") this.deskError('Target für die Ausgabe fehlt', 'Bei der Templateangabe für die Treeauflistung fehlt das Target-Objekt.', 'var hashObj = {<b>target: $(\'el-id\')</b>, template: \'\'}');
		if(typeof(tplOptions.template) == "undefined") this.deskError('Templateangaben fehlen', 'Bei der Templateangabe für die Treeauflistung fehlt das Templategerüst.', 'var hashObj = {target: $(\'el-id\'), <b>template: \'\'</b>}');
		
		this._verzTreeSubBuild(tree.result, 'nav', tplOptions);
	}
	
	,_verzTreeSubBuild: function(tree, level, tplOptions){
		
		var objH = $H(tplOptions);
		tmpLevel = level;
		tmpLevel2 = level;
		$each(tree, function(items, i){
			
			items = $H(items)
			if(level == 0) items.lr.rubrikname =  '<a href="#" id=""><b>' + items.lr.rubrikname + '</b></a>';
			else items.lr.rubrikname =  '<a href="#" id="">' + items.lr.rubrikname + '</a>';
			
			if($type(objH.template) == 'element') var tplStr = $('template').get('html');
			else var tplStr = objH.getFromPath('template.0');
			
			outLevel = level + '_' + items.lr.position;
			tplStr = tplStr.replace('{lr.rubrikname}', '{lr.rubrikname} ' + outLevel);
			tplStr = tplStr.xtemplate(items);
			
			var newEl = tplStr.toDOM();
			newEl.inject(tplOptions.target);
			
			if(items.sub){
				tmpLevel = level + '_' + items.lr.position;
				this._verzTreeSubBuild(items.sub, tmpLevel, tplOptions);
			}
		}, this);
	}
	
	/**
	 * 
	 */
	,_verzMainBuild: function(){
		
		
	}
	
	,deskError: function(title, text, code){
		
		new Element('div', {
			'html': '<b style="background-color: #67726A; color: #ffffff; line-height:20px;">&nbsp;DESK-JS Fehler:&nbsp;</b> <b>' + title + '</b><br />' + text + '<br /><div style="background-color: #ffffff; margin: 8px; padding: 5px; width: 40%;">' + code + '</div>'
			,'class': 'text'
			,'styles': {
				'position': 'absolute'
				,'width': '100%'
				,'left': 0
				,'top': 0
				,'color': '#67726A'
				,'background-color': '#DFDEDA'
				,'border-bottom': '1px solid #67726A'
				,'padding': '8px'
				,'z-index': 9999
			}
		}).inject(document.body, 'top');
	}
});

/**
* DOM - Prerenderer
*  http://mootools.net/forge/p/string_todom
*/
String.implement({
	
	// string to DOM
	toDOM: function(){
		var wrapper =	this.test('^<the|^<tf|^<tb|^<colg|^<ca') && ['<table>', '</table>', 1] ||
				this.test('^<col') && ['<table><colgroup>', '</colgroup><tbody></tbody></table>',2] ||
				this.test('^<tr') && ['<table><tbody>', '</tbody></table>', 2] ||
				this.test('^<th|^<td') && ['<table><tbody><tr>', '</tr></tbody></table>', 3] ||
				this.test('^<li') && ['<ul>', '</ul>', 1] ||
				this.test('^<dt|^<dd') && ['<dl>', '</dl>', 1] ||
				this.test('^<le') && ['<fieldset>', '</fieldset>', 1] ||
				this.test('^<opt') && ['<select multiple="multiple">', '</select>', 1] ||
				['', '', 0];
		var el = new Element('div', {
			html: wrapper[0] + this + wrapper[1]
		}).getChildren();
		while(wrapper[2]--){
			el = el[0].getChildren();
		}
		return el;
	}
	
	// Subsititude von Hash-Obj
	,xtemplate: function(object, regexp){
		tplFunc = function(match, name){
			if (match.charAt(0) == '\\') return match.slice(1);
			var parts = name.split('.');
			var val = object;
			for(var i=0; i < parts.length && ($type(val) == 'object' || $type(val) == 'hash' || $type(val) == 'array'); i++){
				val = val[parts[i]];
			}
			return val == undefined ? '' : $type(val) == 'string' ? val.substitute(object, regexp) : val;
		};
		tplOut = this.replace(regexp || (/\\?\{([^{}]+)\}/g /*cor*/), tplFunc);
		return tplOut;
	}
	
	/*
	,setDOM: function(){
		
	}
	*/
});
