Engine = {};

// ajax request specific
Engine.engineLanguage = 'hu';
Engine.engineSession = 'guest';
Engine.engineUserId = '0';
Engine.engineUserName = '';
Engine.engineUserIp = '127.0.0.1';
Engine.engineSessionTimeOut = 1000 * 60 * 30;	// fél óra

// ajax specific
Engine.ajaxPath = '___ajax/ajax.php';
Engine.ajaxPathGet = Engine.ajaxPath + '?language=' + Engine.engineLanguage + '&session=' + Engine.engineSession + '&userId=' + Engine.engineUserId + '&userIp=' + Engine.engineUserIp;
Engine.ajaxPathPost = Engine.ajaxPath + '?overWriteContollParamsType=POST';

// run specific
Engine.runFrom = 'frontend';
Engine.runSite = 'mandula.hu';
Engine.existsGA = false;

Engine.ajaxMethod = 'POST';
Engine.ajaxWaitForResponse = true;
Engine.ajaxWaitFormLabel = 'waiting...';
Engine.ajaxWaitFormMsg = 'completing request';

Engine.parent_count;
Engine.not_whitespace = new RegExp(/[^\s]/);
Engine.labels = new Object();
Engine.labelsLen = 0;

Ext.BLANK_IMAGE_URL = 'media/image/blank.gif';

/*
 *
 * js init
 *
 */
Ext.onReady( function() {
	Ext.Ajax.disableCaching = false;
	
	init();
} );

Engine.replaceHtmlResponse = function( renderedHtml ) {
	var newHtml = renderedHtml;
	newHtml = newHtml.replace(/userdocs/g , "../userdocs" );
	return newHtml;
}

Engine.replaceHtmlResponseIMG = function( renderedHtml ) {
	var newHtml = renderedHtml;
	newHtml = newHtml.replace(/..\/templates/g , "templates" );
	newHtml = newHtml.replace(/..\/userdocs/g , "userdocs" );
	return newHtml;
}

/*
 *
 * ajax handlers
 *
 */
Engine.errorRecords = Ext.data.Record.create( [
	{ name: 'errorcode' , mapping: 'error/errorcode' , type: 'string' }, 
	{ name: 'errormsg' , mapping: 'error/errormsg' , type: 'string' }, 
	{ name: 'errorcustommsg' , mapping: 'error/errorcustommsg' , type: 'string' }, 
	{ name: 'file' , mapping: 'error/file' , type: 'string' }, 
	{ name: 'line' , mapping: 'error/line' , type: 'string' }
] );

Engine.okRecords = Ext.data.Record.create( [
	{ name: 'success' , mapping: 'succes' , type: 'string' } 
] );

Engine.displayErrorMessage = function( responseRS ) {
	var errors = [];
	if( responseRS.records ) {
		for( var i = 0 , len = responseRS.records.length ; i < len ; i++ ) {
			var r = responseRS.records[ i ];
			errors[ i ] = r.data;
		}
	}

	if( errors[ 0 ][ 'errorcustommsg' ] == '' ) {	// nincs kiegészítő hibaüzenet
		Ext.Msg.alert( Langs.getLabel( 'TXT_LABEL_HEAD_ALERT_ERROR' ) , "<br /><b><font color=\"red\">" + Langs.getLabel( 'ERROR_OCCURED' ) + "</font></b><br /><br />" + "<b>" + Langs.getLabel( 'ERROR_CODE' ) + ":</b> " + errors[ 0 ][ 'errorcode' ] + "<br /><b>" + Langs.getLabel( 'ERROR_MESSAGE' ) + ":</b> " + errors[ 0 ][ 'errormsg' ] );							
	} else {
		Ext.Msg.alert( Langs.getLabel( 'TXT_LABEL_HEAD_ALERT_ERROR' ) , "<br /><font color=\"red\">" + Langs.getLabel( 'ERROR_OCCURED' ) + "</font></b><br /><br />" + "<b>" + Langs.getLabel( 'ERROR_CODE' ) + ":</b> " + errors[ 0 ][ 'errorcode' ] + "<br /><b>" + Langs.getLabel( 'ERROR_MESSAGE' ) + ":</b> " + errors[ 0 ][ 'errormsg' ] + "<br /><b>" + Langs.getLabel( 'ERROR_DESCRIPTION' ) + ":</b> " + errors[ 0 ][ 'errorcustommsg' ] );
	}
}

Engine.displayErrorMessageFromArray = function( xmlArray ) {
	var hasEveryTag = false;
	if( ( typeof( xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errorcode' ] ) == 'undefined' ) || ( typeof( xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errormsg' ] ) == 'undefined' ) ) {
		hasEveryTag = false;
	} else {
		hasEveryTag = true;
	}
	
	if( hasEveryTag ) {
		if( xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errorcustommsg' ] == '' ) {	// nincs kiegészítő hibaüzenet
			Ext.Msg.alert( Langs.getLabel( 'TXT_LABEL_HEAD_ALERT_ERROR' ) , "<br /><b><font color=\"red\">" + Langs.getLabel( 'ERROR_OCCURED' ) + "</font></b><br /><br />" + "<b>" + Langs.getLabel( 'ERROR_CODE' ) + ":</b> " + xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errorcode' ] + "<br /><b>" + Langs.getLabel( 'ERROR_MESSAGE' ) + ":</b> " + xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errormsg' ] );							
		} else {
			Ext.Msg.alert( Langs.getLabel( 'TXT_LABEL_HEAD_ALERT_ERROR' ) , "<br /><font color=\"red\">" + Langs.getLabel( 'ERROR_OCCURED' ) + "</font></b><br /><br />" + "<b>" + Langs.getLabel( 'ERROR_CODE' ) + ":</b> " + xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errorcode' ] + "<br /><b>" + Langs.getLabel( 'ERROR_MESSAGE' ) + ":</b> " + xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errormsg' ] + "<br /><b>" + Langs.getLabel( 'ERROR_DESCRIPTION' ) + ":</b> " + xmlArray[ 'engine' ][ 'response' ][ 'error' ][ 'errorcustommsg' ] );
		}	
	} else {
		Engine.displayUnknownErrorMessage();
	}
}

Engine.displayUnknownErrorMessage = function() {
	Ext.Msg.alert( Langs.getLabel( 'TXT_LABEL_HEAD_ALERT_ERROR' ) , "<br /><b><font color=\"red\">" + Langs.getLabel( 'ERROR_OCCURED' ) + "</font></b><br /><br />" + "<b>" + Langs.getLabel( 'ERROR_CODE' ) + ":</b> 0000<br /><b>" + Langs.getLabel( 'ERROR_MESSAGE' ) + ":</b> " + Langs.getLabel( 'ERROR_0017' ) );							
}

Engine.checkForError = function( xmlArray ) {
	var isOk = false;
	if( typeof( xmlArray[ 'engine' ][ 'success' ] ) != 'undefined' ) {
		isOk = true;
	};
	if( typeof( xmlArray[ 'engine' ][ 'response' ] ) != 'undefined' ) {
		if( typeof( xmlArray[ 'engine' ][ 'response' ][ 'error' ] ) == 'undefined' ) {
			isOk = true;
		}
	};
	if( !isOk ) {
		Engine.displayErrorMessageFromArray( xmlArray );
		return false;						
	} else {
		return true;
	}
}

Engine.replaceDivContentUniversal = function( divName , newDivContent ) {
	if( Ext.isIE ) {
//		alert( divName );
		var newDiv = document.getElementById( divName ).cloneNode( false );
		newDiv.innerHTML = newDivContent;
		document.getElementById( divName ).parentNode.replaceChild( newDiv , document.getElementById( divName ) );
	} else {
		Ext.fly( divName ).update( newDivContent );
	}
}

Engine.convertFrontEndReponseUniversal = function( arrayToConvert ) {
	if( Ext.isIE ) {
		if( typeof( arrayToConvert[ 'engine' ] ) != "undefined" ) {	// van engine, ez alap, ez mindig van látszólag
			var newArray = new Array();
			var tempArray = new Array();
			newArray = arrayToConvert;	// első lépés, az egészet átmentjük az újba
			
			// engine
			//	request
			//	row
			if( typeof( arrayToConvert[ 'engine' ][ 'row' ] ) != "undefined" ) {	// engine->row van, ezt a response alá kellen tenni
				tempArray = arrayToConvert[ 'engine' ][ 'row' ];	// ezt kell áttenni a response alá
				
				newArray[ 'engine' ][ 'response' ] = new Array();	// létrehozzuk a response-t
				newArray[ 'engine' ][ 'response' ][ 'row' ] = new Array();	// létrehozzuk alatta a rowt-t, és ide kopizzuk az eredeti rowt
				newArray[ 'engine' ][ 'response' ][ 'row' ] = tempArray;
				return newArray;
			// engine
			//	request
			//	response
			//		html
			//		total
			} else if( typeof( arrayToConvert[ 'engine' ][ 'response' ] ) != "undefined" ) {	// response van
				if( typeof( arrayToConvert[ 'engine' ][ 'response' ][ 'html' ] ) != "undefined" ) {	// html van
					tempArray = arrayToConvert[ 'engine' ][ 'response' ];	// ezt kell áttenni a row/0 alá
					
					newArray[ 'engine' ][ 'response' ][ 'row' ] = new Array();	// létrehozzuk alatta a rowt-t,
					newArray[ 'engine' ][ 'response' ][ 'row' ][ 0 ] = new Array();	// létrehozzuk alatta a 0-t
					newArray[ 'engine' ][ 'response' ][ 'row' ][ 0 ] = tempArray;
					
					return newArray;
				} else if( typeof( arrayToConvert[ 'engine' ][ 'response' ][ 'row' ] ) != "undefined" ) {	// van row, elvileg ilyenkor nem kell bántani
					return arrayToConvert;
				}
			} else if( typeof( arrayToConvert[ 'engine' ][ 'response' ] ) == "undefined" ) {
				arrayToConvert[ 'engine' ][ 'response' ] = new Array();
				arrayToConvert[ 'engine' ][ 'response' ][ 'total' ] = arrayToConvert[ 'engine' ][ 'total' ];
				return arrayToConvert;
			}
		}
/*		var newArray = new Array();
		var tempArray = new Array();
	
		newArray = arrayToConvert;
		tempArray = arrayToConvert[ 'engine' ][ 'response' ];
		 
		newArray[ 'engine' ][ 'response' ][ 'row' ] = new Array();
		newArray[ 'engine' ][ 'response' ][ 'row' ][ 0 ] = new Array();
		newArray[ 'engine' ][ 'response' ][ 'row' ][ 0 ] = tempArray;
		return newArray;
*/
	} else {
		return arrayToConvert;
	}
}

Engine.decodeXml = function( xmlObjToConvert ) {
	return Engine.xml2array( xmlObjToConvert );
}

Engine.xml2array = function( xmlDoc , parent_count ) {
	var arr;
	var parent = "";
	Engine.parent_count = parent_count || new Object;

	var attribute_inside = 0; 
	
	if(xmlDoc.nodeName && xmlDoc.nodeName.charAt(0) != "#") {
		if(xmlDoc.childNodes.length > 1) { //If its a parent
			arr = new Object;
			parent = xmlDoc.nodeName;
			
		}
	}
	var value = xmlDoc.nodeValue;
	if(xmlDoc.parentNode && xmlDoc.parentNode.nodeName && value) {
		if( Engine.not_whitespace.test( value ) ) { //If its a child
			arr = new Object;
			arr[xmlDoc.parentNode.nodeName] = value;
		}
	}

	if(xmlDoc.childNodes.length) {
		if(xmlDoc.childNodes.length == 1) { //Just one item in this tag.
			arr = Engine.xml2array( xmlDoc.childNodes[ 0 ] , Engine.parent_count ); //:RECURSION:
		} else { //If there is more than one childNodes, go thru them one by one and get their results.
			var index = 0;

			for(var i=0; i<xmlDoc.childNodes.length; i++) {//Go thru all the child nodes.
				var temp = Engine.xml2array( xmlDoc.childNodes[ i ] , Engine.parent_count ); //:RECURSION:
				if(temp) {
					var assoc = false;
					var arr_count = 0;
					for(key in temp) {
						if(isNaN(key)) assoc = true;
						arr_count++;
						if(arr_count>2) break;//We just need to know wether it is a single value array or not
					}

					if(assoc && arr_count == 1) {
						if(arr[key]) { 	//If another element exists with the same tag name before,
										//		put it in a numeric array.
							//Find out how many time this parent made its appearance
							if( !Engine.parent_count || !Engine.parent_count[ key ] ) {
								Engine.parent_count[ key ] = 0;

								var temp_arr = arr[key];
								arr[key] = new Object;
								arr[key][0] = temp_arr;
							}
							Engine.parent_count[ key ]++;
							arr[ key ][ Engine.parent_count[ key ] ] = temp[ key ]; //Members of of a numeric array
						} else {
							Engine.parent_count[ key ] = 0;
							arr[key] = temp[key];
							if(xmlDoc.childNodes[i].attributes.length) {
								for(var j=0; j<xmlDoc.childNodes[i].attributes.length; j++) {
									var nname = xmlDoc.childNodes[i].attributes[j].nodeName;
									if(nname) {
										/* Value and Attribute inside the tag */
										if(attribute_inside) {
											var temp_arr = arr[key];
											arr[key] = new Object;
											arr[key]['value'] = temp_arr;
											arr[key]['attribute_'+nname] = xmlDoc.childNodes[i].attributes[j].nodeValue;
										} else {
										/* Value in the tag and Attribute otside the tag(in parent) */
											arr['attribute_' + key + '_' + nname] = xmlDoc.childNodes[i].attributes[j].nodeValue;
										}
									}
								} //End of 'for(var j=0; j<xmlDoc. ...'
							} //End of 'if(xmlDoc.childNodes[i] ...'
						}
					} else {
						arr[index] = temp;
						index++;
					}
				} //End of 'if(temp) {'
			} //End of 'for(var i=0; i<xmlDoc. ...'
		}
	}

	if(parent && arr) {
		var temp = arr;
		arr = new Object;
		
		arr[parent] = temp;
	}
	return arr;
}

Engine.dump = function( arr , level ) {
	var dumped_text = "";
	if( !level ) {
		level = 0;
	}

	var level_padding = "";
	for( var j = 0 ; j < level + 1 ; j++ ) {
		level_padding += "    ";
	}

	if( typeof( arr ) == 'object' ) {	// array vagy hashes vagy objects
		for( var item in arr ) {
			var value = arr[ item ];
			if( typeof( value ) == 'object' ) {		// tömb
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += Engine.dump( value , level + 1 );
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { // sting vagy karakter vagy szám vagy bool, stb
		dumped_text = "===>" + arr + "<===(" + typeof( arr ) + ")";
	}
	
	return dumped_text;
} 

