﻿StringBuilder = function(initialText) {
    this._parts = (typeof(initialText) !== 'undefined' && initialText !== null && initialText !== '') ?
        [initialText.toString()] : [];
    this._value = {};
    this._len = 0;
}
StringBuilder.prototype = {
    append: function(text) {
    	this._parts[this._parts.length] = text;
	},
    appendLine: function(text) {
    	this._parts[this._parts.length] = 
    		((typeof(text) === 'undefined') || (text === null) || (text === '')) ? '\r\n' : text + '\r\n';},
    clear: function() {
    	this._parts = [];
		this._value = {};
		this._len = 0;
	},
	isEmpty: function() {
		return this.toString() === '';
	},
	toString: function(separator) {
		separator = separator || '';
        var parts = this._parts;
        if (this._len !== parts.length) {
            this._value = {};
            this._len = parts.length;
        }
        var val = this._value;
        if (typeof(val[separator]) === 'undefined') {
			if (separator !== '') {
                for (var i = 0; i < parts.length;) {
                    if ((typeof(parts[i]) === 'undefined') || (parts[i] === '') || (parts[i] === null)) {
                        parts.splice(i, 1);
                    }
                    else {
                        i++;
                    }
                }
            }
            val[separator] = this._parts.join(separator);
        }
        return val[separator];
	}
}

JavaScriptSerializer = function() {
}
JavaScriptSerializer.prototype = {
 	serialize: function(object) {
	    var stringBuilder = new StringBuilder();
    	JavaScriptSerializer._serializeWithBuilder(object, stringBuilder, false);
	    return stringBuilder.toString();
	},
	deserialize: function(data) {
    	try {
        	var exp = data.replace(new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)\\)\\\\/\\"', 'g'), "$1new Date($2)");
        	return eval('(' + exp + ')');
    	}
    	catch (e) {
			alert(data);
    	}
	}
}
var serializer = new JavaScriptSerializer();
JavaScriptSerializer._stringRegEx = new RegExp('["\b\f\n\r\t\\\\\x00-\x1F]', 'i');
JavaScriptSerializer._serializeWithBuilder = function(object, stringBuilder, sort) {
	var i;
	switch (typeof object) {
		case 'object':
			if (object) {
				if (typeof object.length == 'number' && typeof object.splice == 'function') {
            		stringBuilder.append('[');
	                for (i = 0; i < object.length; ++i) {
	                    if (i > 0) {
	                        stringBuilder.append(',');
	                    }
	                    JavaScriptSerializer._serializeWithBuilder(object[i], stringBuilder);
	                }
	                stringBuilder.append(']');
	            }
        		else {
					if (typeof object.getFullYear == 'function') {
	                    stringBuilder.append('"\\/Date(');
	                    stringBuilder.append(object.getTime());
	                    stringBuilder.append(')\\/"');
	                    break;
	                }

	                var properties = [];
	                var propertyCount = 0;
	                for (var name in object) {
						if (name.substr(0, 1) == '$') {
	                        continue;
	                    }
	                    properties[propertyCount++] = name;
	                }
	                if (sort) properties.sort();

            		stringBuilder.append('{');
            		var needComma = false;
	                for (i=0; i<propertyCount; i++) {
	                    var value = object[properties[i]];
	                    if (typeof value !== 'undefined' && typeof value !== 'function') {
	                        if (needComma) {
	                            stringBuilder.append(',');
	                        }
	                        else {
	                            needComma = true;
	                        }
	                        
							JavaScriptSerializer._serializeWithBuilder(properties[i], stringBuilder, sort);
	                        stringBuilder.append(':');
	                        JavaScriptSerializer._serializeWithBuilder(value, stringBuilder, sort);
	                    }
	                }
            		stringBuilder.append('}');
        		}
    		}
    		else {
        		stringBuilder.append('null');
    		}
    		break;

		case 'number':
	        if (isFinite(object)) {
	            stringBuilder.append(String(object));
	        }
	        else {
	            stringBuilder.append('null');
	        }
	        break;

	    case 'string':
	        stringBuilder.append('"');
			if (JavaScriptSerializer._stringRegEx.test(object)) {
	            var length = object.length;
	            for (i = 0; i < length; ++i) {
	                var curChar = object.charAt(i);
					if (curChar >= ' ') {
						if (curChar === '\\' || curChar === '"') {
	                        stringBuilder.append('\\');
	                    }
	                    stringBuilder.append(curChar);
	                }
	                else {
	                    switch (curChar) {
	                        case '\b':
	                            stringBuilder.append('\\b');
	                            break;
	                        case '\f':
	                            stringBuilder.append('\\f');
	                            break;
	                        case '\n':
	                            stringBuilder.append('\\n');
	                            break;
	                        case '\r':
	                            stringBuilder.append('\\r');
	                            break;
	                        case '\t':
	                            stringBuilder.append('\\t');
	                            break;
	                        default:
								stringBuilder.append('\\u00');
	                            if (curChar.charCodeAt() < 16) stringBuilder.append('0');
	                            stringBuilder.append(curChar.charCodeAt().toString(16));
	                    }
	                }
	            }
	        } else {
	            stringBuilder.append(object);
	        }
	        stringBuilder.append('"');
	        break;

	    case 'boolean':
	        stringBuilder.append(object.toString());
	        break;

	    default:
	        stringBuilder.append('null');
	        break;
    }
}

function EvalResult(result) {
    try {
        eval(result);
    }
    catch(e) {
        alert(result);
    }
}

DataController = function(Type, sync) {
    this.Arg = new function() {
        this.Type = null;
        this.Action = null;
        this.Key = null;
        this.Data = null;
    };
    this.Submit = function(callback) {
        if (typeof showAjaxWaiting == 'function')
            showAjaxWaiting();
        this.Arg.Type = Type;
        this.Request("DataController.ashx" + (typeof (_UrlQuery) != 'undefined' ? _UrlQuery : ''), serializer.serialize(this.Arg), function(executor, eventArgs) {
            if (executor.responseText != null) {
                if (executor.responseText.length > 0 && callback) {
                    callback(serializer.deserialize(executor.responseText));
                }
                else if (callback) {
                    callback();
                }
            }
            if (typeof stopAjaxWaiting == 'function')
                stopAjaxWaiting();
        }
        );
    };
    this.Request = function(url, data, callback) {
        var req;
        if (window.XMLHttpRequest) {
            req = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        req.onreadystatechange = function() {
            if (req.readyState == 4) {
                if (req.status < 400) {
                    callback(req, data);
                }
                else {
                    document.write(req.responseText);
                }
            }
        }
        req.open("POST", url, !sync);
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        req.send(data);
        return req;
    }
}

DataController.prototype = {
    Add : function(info, callback) {
        this.Arg.Action = "Add";
        this.Arg.Data = info;
        this.Submit(callback);
    },
    AptitudeUpdate : function(key, info, callback) {
        this.Arg.Action = "AptitudeUpdate";
        this.Arg.Key = key;
        this.Arg.Data = info;
        this.Submit(callback);
    },
    Delete : function(key, callback) {
        this.Arg.Action = "Delete";
        this.Arg.Key = key;
        this.Submit(callback);
    },
    Get : function(key, callback) {
        this.Arg.Action = "Get";
        this.Arg.Key = key;
        this.Submit(callback);
    },
    GetAll : function(callback) {
        this.Arg.Action = "GetAll";
        this.Submit(callback);
    },
    Update : function(info, callback) {
        this.Arg.Action = "Update";
        this.Arg.Data = info;
        this.Submit(callback);
    },
    Execute : function(action, args, callback) {
        this.Arg.Action = action;
        this.Arg.Key = null;
        this.Arg.Data = args;
        this.Submit(callback);
    }
}


