var XTR_STARTED=false;

var win2utf=function(str){
  return str;
    var ret='';
                 
        for(var i=0;i<str.length;i++)
        {
            var n = str.charCodeAt(i);
         
            if((n>=0x410&&n<= 0x44F)||(n==0x401)||(n==0x451)||(n>=0x0A1&&n<=0x0BE)||(n==0x394)||
            (n==8212)||(n==8211)||(n==0xDC)||(n==0xC4)||(n==0xDF)||(n==0xE4)||(n==0xFC))
            {            
                ret+='&#'+n+';';
            }else{
                
                ret+=''+str.charAt(i);
            }
            
            }
                  
    return ret;
    }
   
    
    
var XOAD_ERROR_USER = 0x400;
var XOAD_ERROR_TIMEOUT = 0x401;
var xoad = {};
xoad.errorHandler = null;
xoad.callbacks = {};
xoad.callbacks.table = {};
xoad.callbacks.count = 0;
xoad.events = {};
xoad.events.table = [];
xoad.events.postTable = [];
xoad.events.timeout = 5000;
xoad.events.startInterval = 250;
xoad.events.refreshInterval = 2000;
xoad.events.status = 0;
xoad.observers = [];
xoad.asyncCall = function() {};
xoad.callSuspender = function()
{
return {
suspend : function() {
this.suspended = true;
},
suspended : false
}
};

xoad.alert=function(errorMessage)
{    
    alert(errorMessage);
}

xoad.getError = function(errorCode, errorMessage)
{
return {
code : errorCode,
message : errorMessage
}
};
xoad.getXmlHttp = function()
{
var xmlHttp = null;
try {
xmlHttp = new XMLHttpRequest();
} catch (e) {
var progIds = ['MSXML2.XMLHTTP', 'Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0'];
var success = false;
for (var iterator = 0; (iterator < progIds.length) && ( ! success); iterator ++) {
try {
xmlHttp = new ActiveXObject(progIds[iterator]);
success = true;
} catch (e) {}
}
if ( ! success ) {
return null;
}
}
return xmlHttp;
};
xoad.clone = function(target, source)
{
var wipeKeys = [];
var key = null;
for (key in target.__meta) {
if (typeof(source[key]) == 'undefined') {
wipeKeys[wipeKeys.length] = key;
}
}
if (wipeKeys.length > 0) {
for (var iterator = 0; iterator < wipeKeys.length; iterator ++) {
target[wipeKeys[iterator]] = null;
}
}
for (key in source.__meta) {
if (source[key] == null) {
target[key] = null;
} else {
target[key] = source[key];
}
}
target.__meta = source.__meta;
target.__size = source.__size;
target.__timeout = source.__timeout;
};
xoad.serialize = function(data)
{
if (data == null) {
return 'N;';
}
var type = typeof(data);
var code = '';
var iterator = 0;
var length = null;
var asciiCode = null;
var key = null;

if(type=='function')return '';
if (type == 'boolean') {
code += 'b:' + (data ? 1 : 0) + ';';
} else if (type == 'number') {
if (Math.round(data) == data) {
code += 'i:' + data + ';';
} else {
code += 'd:' + data + ';';
}
} else if (type == 'string') {
//data=win2utf(data);
length = data.length;
for (iterator = 0; iterator < data.length; iterator ++) {
asciiCode = data.charCodeAt(iterator);
if ((asciiCode >= 0x00000080) && (asciiCode <= 0x000007FF)) {
length += 1;
} else if ((asciiCode >= 0x00000800) && (asciiCode <= 0x0000FFFF)) {
length += 2;
} else if ((asciiCode >= 0x00010000) && (asciiCode <= 0x001FFFFF)) {
length += 3;
} else if ((asciiCode >= 0x00200000) && (asciiCode <= 0x03FFFFFF)) {
length += 4;
} else if ((asciiCode >= 0x04000000) && (asciiCode <= 0x7FFFFFFF)) {
length += 5;
}
}
code += 's:' + length + ':"' +data + '";';
} else if (type == 'object') {
if (typeof(data.__class) == 'undefined') {
length = 0;
if (
(typeof(data.length) == 'number') &&
(data.length > 0) &&
(typeof(data[0]) != 'undefined')) {
for (iterator = 0; iterator < data.length; iterator ++) {
code += xoad.serialize(iterator);
code += xoad.serialize(data[iterator]);
}
length = data.length;
} else {
for (key in data) {
if(typeof(data[key])!='function'){
if (/^[0-9]+$/.test(key)) {
code += xoad.serialize(parseInt(key));
} else {
code += xoad.serialize(key);
}
code += xoad.serialize(data[key]);
length ++;
}
}
}
code = 'a:' + length + ':{' + code + '}';
} else {
code += 'O:' + data.__class.length + ':"' + data.__class + '":' + data.__size + ':{';
if (data.__meta != null) {
for (key in data.__meta) {
code += xoad.serialize(key);
code += xoad.serialize(data[key]);
}
}
code += '}';
}
} else {
code = 'N;'
}

return code;
};
xoad.setErrorHandler = function(handler)
{
if (
(handler != null) &&
(typeof(handler) == 'function')) {
xoad.errorHandler = handler;
return true;
}
return false;
};
xoad.restoreErrorHandler = function()
{
xoad.errorHandler = null;
return true;
};
xoad.throwException = function(error, throwArguments)
{
if (typeof(throwArguments) != 'undefined') {
var sender = throwArguments[0];
var method = throwArguments[1];
method = 'on' + method.charAt(0).toUpperCase() + method.substr(1) + 'Error';
if (xoad.invokeMethod(sender, method, [error])) {
return false;
}
}
if (
(xoad.errorHandler != null) &&
(typeof(xoad.errorHandler) == 'function')) {
xoad.errorHandler(error);
return false;
}
throw error;
};
xoad.invokeMethod = function(obj, method, invokeArguments)
{
if (
(obj == null) ||
(typeof(obj) != 'object')) {
return false;
}
var type = eval('typeof(obj.' + method + ')');
if (type == 'function') {
var invokeCode = 'obj.' + method + '(';
if (typeof(invokeArguments) != 'undefined') {
for (var iterator = 0; iterator < invokeArguments.length; iterator ++) {
invokeCode += 'invokeArguments[' + iterator + ']';
if (iterator < invokeArguments.length - 1) {
invokeCode += ', ';
}
}
}
invokeCode += ')';
return eval(invokeCode);
}
return false;
};

xoad.call = function(obj, method, callArguments)
{
 if(XTR_STARTED)XTR_main.show_loading();  
if (
(obj == null) ||
(typeof(obj) != 'object') ||
(typeof(obj.__class) != 'string')) {
 if(XTR_STARTED)XTR_main.hide_loading();      
return false;
}
var methodCallback = null;
if(typeof(obj.lct) != 'undefined')
{   

        obj.clear_module_vars();

}
var methodArgs = [];
for (var iterator = 0; iterator < callArguments.length; iterator ++) {
if (
(typeof(callArguments[iterator]) == 'function') &&
(iterator == callArguments.length - 1)) {
methodCallback = callArguments[iterator];
continue;
}
methodArgs[methodArgs.length] = callArguments[iterator];
}

var xmlHttp = xoad.getXmlHttp();
var requestBody = {
source : obj,
className : obj.__class,
method : method,
arguments : methodArgs
};
xoad.notifyObservers('call', requestBody);

requestBody.source = xoad.serialize(requestBody.source);

requestBody.arguments = xoad.serialize(requestBody.arguments);
requestBody = xoad.serialize(requestBody);

var url = obj.__url;
if (url.indexOf('?') < 0) {
url += '?';
} else {
url += '&';
}
url += 'xoadCall=true';
if (methodCallback != null) {
xmlHttp.open('POST', url, true);
} else {
xmlHttp.open('POST', url, false);
}
var callId = null;
//functions added from php
obj.__clone=function(obj){xoad.clone(this,obj)};
obj.__serialize=function(){return xoad.serialize(this)};
obj.getTimeout = function(){return this.__timeout};
obj.setTimeout=function(miliseconds){this.__timeout=miliseconds};
obj.clearTimeout=function(){this.__timeout=null};
//
var callTimeout = obj.getTimeout();
if (callTimeout != null) {
callId = xoad.callbacks.count;
}
xoad.callbacks.count ++;
var callResult = true;
var requestCompleted = function() {
if (typeof(callResult) == 'object') {
if (callResult.suspended) {
     
return false;
}
}
if (callId != null) {
if (eval('xoad.callbacks.table.call' + callId + '.timeout')) {
   
return false;
}
eval('window.clearTimeout(xoad.callbacks.table.call' + callId + '.id)');
eval('xoad.callbacks.table.call' + callId + ' = null');
}
if (xmlHttp.status != 200) {
  ;   
return xoad.throwException(xoad.getError(xmlHttp.status, xmlHttp.statusText), [obj, method]);
} else {
if (xmlHttp.responseText == null) {
   
return xoad.throwException(xoad.getError(xmlHttp.status, 'Empty response.'), [obj, method]);
}

if (xmlHttp.responseText == 'SESSION_TIME_EXPIRED') 
{
        return xoad.alert('Session time expired, please login again.');
}

            
if (xmlHttp.responseText.length < 1) {
   
return xoad.throwException(xoad.getError(xmlHttp.status, 'Empty response.'), [obj, method]);
}
try {
var resp=xmlHttp.responseText;
eval('var xoadResponse = ' + resp + ';');
} catch(e) {
     
return xoad.throwException(xoad.getError(xmlHttp.status, 'Invalid response:'+xmlHttp.responseText), [obj, method]);
}
if (typeof(xoadResponse.exception) != 'undefined') {
     
return xoad.throwException(xoad.getError(XOAD_ERROR_USER, xoadResponse.exception), [obj, method]);
}
if (xoad.notifyObservers('callCompleted', xoadResponse)) {
obj.__clone(xoadResponse.returnObject);
if (typeof(xoadResponse.output) != 'undefined') {
obj.__output = xoadResponse.output;
} else {
obj.__output = null;
}

return {
returnValue : xoadResponse.returnValue
};
}
}
 
return false;
};
try {
xmlHttp.setRequestHeader('Content-Length', requestBody.length);
xmlHttp.setRequestHeader('Content-Type', 'text/plain; charset=UTF-8');
xmlHttp.setRequestHeader('Accept-Charset', 'UTF-8');
} catch (e) {}
if (methodCallback != null) {
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
var response = requestCompleted();
if (typeof(response.returnValue) != 'undefined') {
methodCallback(response.returnValue);
}
}
}
}
if (callTimeout != null) {
eval('xoad.callbacks.table.call' + callId + ' = {}');
eval('xoad.callbacks.table.call' + callId + '.timeout = false');
eval('xoad.callbacks.table.call' + callId + '.source = obj');
eval('xoad.callbacks.table.call' + callId + '.id = '
+ 'window.setTimeout(\'xoad.callbacks.table.call' + callId + '.timeout = true; '
+ 'xoad.throwException(xoad.getError(XOAD_ERROR_TIMEOUT, "Timeout."), [xoad.callbacks.table.call' + callId + '.source, "' + method + '"]);\', callTimeout)');
}
xmlHttp.send(requestBody);
if (methodCallback == null) {
var response = requestCompleted();
if (typeof(response.returnValue) != 'undefined') 
{
    if(XTR_STARTED)XTR_main.hide_loading();    
return response.returnValue;
}
    if(XTR_STARTED)XTR_main.hide_loading();   
return null;
} else {
callResult = new xoad.callSuspender();
if(XTR_STARTED)XTR_main.hide_loading();     
return callResult;
}
};



/*--events here--*/

xoad.addObserver = function(observer)
{
xoad.observers[xoad.observers.length] = observer;
return true;
};
xoad.notifyObservers = function(event)
{
if (xoad.observers.length < 1) {
return true;
}
var eventMethod = 'on' + event.charAt(0).toUpperCase() + event.substr(1);
var notifyArguments = [];
var iterator = 0;
for (iterator = 1; iterator < arguments.length; iterator ++) {
notifyArguments[notifyArguments.length] = arguments[iterator];
}
for (iterator = 0; iterator < xoad.observers.length; iterator ++) {
xoad.invokeMethod(xoad.observers[iterator], eventMethod, notifyArguments);
}
return true;
};





xoad.html = {};

xoad.html.onCallCompleted = function(response) {

	if (typeof(response.html) == 'string') {

		if (response.html.length > 0) {

			try {

				eval(response.html);

			} catch (e) {};
		}
	}
};

xoad.html.exportForm = function(id,fullselect) {


if(typeof id=='object'){
    var form = id;
    } else{
    var form = document.getElementById(id);
    }

	if (form == null) {

		return null;
	}

	if (typeof(form.elements) == 'undefined') {

		return null;
	}

	var formData = {};

	for (var iterator = 0; iterator < form.elements.length; iterator ++) {

		var element = form.elements[iterator];

		if (element.disabled) {

			continue;
		}

		var elementType = element.tagName.toLowerCase();

		var elementName = null;
		var elementValue = null;

		if (
		(typeof(element.name) != 'undefined') &&
		(element.name.length > 0)) {

			elementName = element.name;

		} else if (
		(typeof(element.id) != 'undefined') &&
		(element.id.length > 0)) {

			elementName = element.id;
		}

		if (elementName != null) {

			if (elementType == 'input') {

				if (
				(element.type == 'text') ||
				(element.type == 'password') ||
				(element.type == 'button') ||
				(element.type == 'submit') ||
				(element.type == 'hidden')) {

					elementValue = element.value;

				} else if (element.type == 'checkbox') {

					elementValue = element.checked;

				} else if (element.type == 'radio') {

					if (element.checked) {

						elementValue = element.value;

					} else {

						try {

							var type = eval('typeof(formData.' + elementName + ')');

							if (type != 'undefined') {

								continue;
							}

						} catch (e) {

							continue;
						}
					}
				}

			} else if (elementType == 'select') {

				if (element.options.length > 0) {

					if (element.multiple) {

						elementName = elementName.replace(/\[\]$/ig, '');

						elementValue = [];

						for (var optionsIterator = 0; optionsIterator < element.options.length; optionsIterator ++) {

							if(element.getAttribute('fullselect'))
                            {
                                elementValue[element.options[optionsIterator].value]=element.options[optionsIterator].text;
                            }
                           else{ 
                           if (element.options[optionsIterator].selected) {

								elementValue.push(element.options[optionsIterator].value);
							}
                           }
						}

					} else {

						if (element.selectedIndex >= 0) {

							elementValue = element.options[element.selectedIndex].value;
						}
					}
				}

			} else if (elementType == 'textarea') {

				elementValue = element.value;
			}

			try {

				eval('formData.' + elementName + ' = elementValue;');

			} catch (e) {}
		}
	}

	return formData;
};

xoad.html.importForm = function(id, formData) {
     
	if(typeof id=='Object'){
    var form = id;
    } else{
    var form = document.getElementById(id);
    }

	if (
	(formData == null) ||
	(form == null)) {

		return false;
	}

	if (typeof(form.elements) == 'undefined') {

		return false;
	}

	for (var iterator = 0; iterator < form.elements.length; iterator ++) {

		var element = form.elements[iterator];

		if (element.disabled) {

			continue;
		}

		var elementType = element.tagName.toLowerCase();

		var elementName = null;

		if (
		(typeof(element.name) != 'undefined') &&
		(element.name.length > 0)) {

			elementName = element.name;

		} else if (
		(typeof(element.id) != 'undefined') &&
		(element.id.length > 0)) {

			elementName = element.id;
		}

		if (elementName != null) {

			if (elementType == 'select') {

				if (element.multiple) {

					elementName = elementName.replace(/\[\]$/ig, '');
				}
			}

			var elementValue = null;

			try {

				var valueType = eval('typeof(formData.' + elementName + ')');

				if (valueType != 'undefined') {

					elementValue = eval('formData.' + elementName);

				} else {

					continue;
				}

			} catch (e) {

				continue;
			}

			if (elementType == 'input') {

				if (
				(element.type == 'text') ||
				(element.type == 'password') ||
				(element.type == 'button') ||
				(element.type == 'submit') ||
				(element.type == 'hidden')) {

					element.value = elementValue;

				} else if (element.type == 'checkbox') {

					element.checked = elementValue;

				} else if (element.type == 'radio') {

					if (element.value == elementValue) {

						element.checked = true;

					} else {

						element.checked = false;
					}
				}

			} else if (elementType == 'select') {

		           if (elementValue != null) {  

					if (element.multiple) {

						element.selectedIndex = -1;

					} else {

						

						element.selectedIndex = 0;
					}
                    
                    if(typeof elementValue =='string')
                    {
                    
                        element.value=elementValue;
                    
                    }else{
                    
                    
					for (var valuesIterator = 0; valuesIterator < elementValue.length; valuesIterator ++) 
                    {
                    
                      opt = document.createElement("option");
                      
                      opt.value = elementValue[valuesIterator].value ;
                      opt.text = elementValue[valuesIterator].text;
                                                       
                      if(Prototype.Browser.IE)
                      {
                        element.add(opt);
                      }else{
                      
                        element.appendChild(opt);
                      
                      }
                      
                         if(elementValue[valuesIterator].selected)
                      {
                          opt.selected = elementValue[valuesIterator].selected;
                      
                      }		
                    }
				}
                   }

			
            } else if (elementType == 'textarea') {

				element.value = elementValue;
			}
		}
	}

	return true;
};

xoad.addObserver(xoad.html);

