﻿(function($) {    
    
    $.ajaxPost = function(options) {
        var settings = $.extend({}, options);
        
        var data;
        if(settings.selector){
            if(settings.dtoName)
                data = '{"' + settings.dtoName + '":' + $.toJSON($('*[name]', $(options.selector)).serializeObject(settings.data)) + '}';
            else {
            	var o = $('*[name]', $(options.selector)).serializeObject(settings.data);
                data = $.toJSON(o);
                }
        }
        else
            data = $.toJSON(settings.data);
        
        $.ajax({
            type: 'POST',
            url: settings.url,
            data: data,
            cache: false,
            dataFilter: function(data, type){
                jdata = $.evalJSON(data).d;
                 for(k = 0; k < jdata.length; k++){
                    for(var d in jdata[k])
                        var value = $.formatDate(jdata[k][d]);
                }
                return jdata;
            },
            beforeSend: function(xhr) {
                if (!settings.beforeSend)
                    return true;
                return settings.beforeSend(xhr);
            },
            success: function(response, statusText) {
                if (settings.success)
                    return settings.success(response, statusText);
            },
            error: function(xhr, errorStatus, errorThrown) {
                var errorResponse = $.evalJSON(xhr.responseText);
                if (settings.error)
                    settings.error(xhr, errorStatus, errorResponse);
                else
                    alert(errorResponse.Message);
            },
            complete: function(xhr, statusText) {
                if (settings.complete)
                    settings.complete(xhr, statusText);
            }
        });
        return false;
    };
    
    $.fn.serializeObject = function(additionalData) {
        var o = {};
        var a = this.serializeArray();

        if (additionalData && typeof (additionalData) == 'object')
            $.merge(a, $.formParam(additionalData));
          
        $.each(a, function() {
            var el = $('input[name=' + this.name + ']');
            var useArr = (el.length > 1 && el.attr('type') === 'checkbox');
            if (o[this.name]) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');                
            } else {
                if(useArr)
                    o[this.name] = [this.value || ''];
                else
                    o[this.name] = this.value || '';
            }
        });
        return o;
    };
    
    $.formParam = function(a) {
        var s = [];

        function add(key, value) {
            s[s.length] = { name: key, value: value };
        };

        if ($.isArray(a) || a.jquery)
            $.each(a, function() {
                add(this.name, this.value);
            });

        else
            for (var j in a) {
            if ($.isArray(a[j])) {
                $.each(a[j], function() {
                    add(j, this);
                });
            }
            else
                add(j, $.isFunction(a[j]) ? a[j]() : a[j]);
        }
        return s;
    };
    
    function toIntegersAtLease(n)
    {
        return n < 10 ? '0' + n : n;
    }

    Date.prototype.toJSON = function(date)
    {
        return this.getUTCFullYear() + '-' +
             toIntegersAtLease(this.getUTCMonth()) + '-' +
             toIntegersAtLease(this.getUTCDate());
    };

    var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
    var meta = {    // table of character substitutions
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"': '\\"',
        '\\': '\\\\'
    };
})(jQuery);


(function($){$.toJSON=function(o)
{if(typeof(JSON)=='object'&&JSON.stringify)
return JSON.stringify(o);var type=typeof(o);if(o===null)
return"null";if(type=="undefined")
return undefined;if(type=="number"||type=="boolean")
return o+"";if(type=="string")
return $.quoteString(o);if(type=='object')
{if(typeof o.toJSON=="function")
return $.toJSON(o.toJSON());if(o.constructor===Date)
{var month=o.getUTCMonth()+1;if(month<10)month='0'+month;var day=o.getUTCDate();if(day<10)day='0'+day;var year=o.getUTCFullYear();var hours=o.getUTCHours();if(hours<10)hours='0'+hours;var minutes=o.getUTCMinutes();if(minutes<10)minutes='0'+minutes;var seconds=o.getUTCSeconds();if(seconds<10)seconds='0'+seconds;var milli=o.getUTCMilliseconds();if(milli<100)milli='0'+milli;if(milli<10)milli='0'+milli;return'"'+year+'-'+month+'-'+day+'T'+
hours+':'+minutes+':'+seconds+'.'+milli+'Z"';}
if(o.constructor===Array)
{var ret=[];for(var i=0;i<o.length;i++)
ret.push($.toJSON(o[i])||"null");return"["+ret.join(",")+"]";}
var pairs=[];for(var k in o){var name;var type=typeof k;if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;if(typeof o[k]=="function")
continue;var val=$.toJSON(o[k]);pairs.push(name+":"+val);}
return"{"+pairs.join(", ")+"}";}};$.evalJSON=function(src)
{if(typeof(JSON)=='object'&&JSON.parse)
return JSON.parse(src);return eval("("+src+")");};$.secureEvalJSON=function(src)
{if(typeof(JSON)=='object'&&JSON.parse)
return JSON.parse(src);var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};$.quoteString=function(string)
{if(string.match(_escapeable))
{return'"'+string.replace(_escapeable,function(a)
{var c=_meta[a];if(typeof c==='string')return c;c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};var _escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var _meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};})(jQuery);
