﻿
var CommonAPI =
{
    BaseUrl: '',

    CurrentCulture: '',

    statusWindow: jQuery('<div id="StatusWindow" style="width: 240px; height: 80px;"><div id="statusTxt"></div></div>'),

    UrlParams: function () {
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for (var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }
        return vars;
    },

    RegisterScript: function (id, file, oCallback) {

        var headID = document.getElementsByTagName("head")[0];

        for (var i in headID.childNodes) {
            if (headID.childNodes[i].type == 'text/javascript')
                if (headID.childNodes[i].id == id) {
                    if (oCallback)
                        oCallback();
                    return;
                }
        }

        var js = document.createElement('script');
        js.id = id;
        js.type = 'text/javascript';
        js.src = file;


        js.onreadystatechange = function () {
            if (this.readyState == 'complete' || (jQuery.browser.msie && this.readyState == 'loaded')) {
                if (oCallback)
                    oCallback();
            }
        }
        js.onload = oCallback;

        try {
            headID.appendChild(js)
        }
        catch (e) {
            alert(e);
            //id.src = file;
        }
        return false;
    },

    RegisterCss: function (id, u) {

        var headID = document.getElementsByTagName("head")[0];

        for (var i in headID.childNodes) {
            if (headID.childNodes[i].type == 'text/css')
                if (headID.childNodes[i].id == id)
                    return;
        }

        var e = document.createElement('link');
        e.setAttribute('id', id);
        e.setAttribute('type', 'text/css');
        e.setAttribute('rel', 'stylesheet');
        e.setAttribute('href', u);

        headID.appendChild(e)
    },

    Left: function (str, n) {
        if (n <= 0) {
            return '';
        }
        else if (n > String(str).length) {
            return str;
        }
        else {
            return String(str).substr(0, n);
        }
    },

    Right: function (str, n) {
        if (n <= 0) {
            return '';
        }
        else if (n > String(str).length) {
            return str;
        }
        else {
            var iLen = String(str).length;
            return String(str).substr(iLen - n, n);
        }
    },

    StartsWith: function (str, mtch) {
        var lft = CommonAPI.Left(str, mtch.length);
        return (lft == mtch);
    },

    EndsWith: function (str, mtch) {
        var rght = CommonAPI.Right(str, mtch.length);
        return (rght == mtch);
    },

    NewGuid: function (fnc) {
        var ret = new Array();
        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            async: (fnc != undefined),
            url: CommonAPI.BaseUrl + 'Tools/NewGuid/',
            dataType: "json",
            success: function (result) {
                if (result != null) {
                    if (fnc)
                        fnc(result);
                    else ret = result;
                }
                else
                    alert('Error');
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.responseText);
            }
        });
        return ret;
    },

    FindValue: function (object, propertyName) {

        var token = /\w+/g;

        var results = propertyName.match(token);

        var temp = object;

        for (var i in results) {
            temp = temp[results[i]];
            if (!temp)
                return null;
        }
        return temp;

    },
    SupportedCulture: function () {
        var ret;
        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            async: false,
            url: CommonAPI.BaseUrl + 'Base/SupportedCultures/',
            dataType: "json",
            success: function (result) {
                if (result != null) {
                    ret = result;
                }
                else
                    alert('Error');
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.responseText);
            }
        });
        return ret;
    },

    SendEmail: function (to, from, subject, message) {

        var flag = false;

        var o = new Object();
        o.To = to;
        o.From = from;
        o.Subject = subject;
        o.Message = message;

        postdata = jQuery.toJSON(o);

        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            async: false,
            url: CommonAPI.BaseUrl + 'Base/SendEmail/',
            dataType: "json",
            data: postdata,
            success: function (result) {
                if (result != null && result == true) {
                    flag = true;
                }
                else
                    alert('Error');
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
               alert(XMLHttpRequest.responseText);
            }
        });

        return flag;
    },
    ShowStatusWindow: function (text) {
        jQuery.modaldialog.remove();
        jQuery.modaldialog.progress(text, {
            showClose: false,
            title: '',
            width: 200
        });
    },
    HideStatusWindow: function () {
        jQuery.modaldialog.hide();
    }
};

var FormEditableAPI =
{
    stack: new Array(),


    FormCulture: function (culture) {
        if (!jQuery.cookie)
            return null;

        if (culture) {
            jQuery.cookie('Arronix.ePortal.FormCulture', culture, { expires: 10 });
            return this;
        }
        var val = jQuery.cookie('Arronix.ePortal.FormCulture');
        if (val)
            return val;

        return CommonAPI.CurrentCulture;
    },

    SetCulture: function (culture) {
        FormEditableAPI.FormCulture(culture);
    },

    RegisterItem: function (type, id) {
        FormEditableAPI.RegisterItem(type, id, undefined);
    },

    RegisterItem: function (type, id, selector) {

        var items;
        if (selector)
            items = jQuery(selector);
        else
            items = jQuery('.auto_save');

        jQuery(items).live("change", function () {

            var val;
            //hidden = text
            if (this.type == "checkbox")
                val = jQuery(this).attr("checked");
            else
                val = jQuery(this).val();

            if (jQuery(this).hasClass('localize')) {
                FormEditableAPI.AddOrUpdate(id, jQuery(this).attr('name'), val, FormEditableAPI.FormCulture(), type);
            }
            else {
                FormEditableAPI.AddOrUpdate(id, jQuery(this).attr('name'), val, undefined, type);
            }
        });
    },

    AddOrUpdate: function (id, item, value, culture, type) {

        for (var i = 0; i < FormEditableAPI.stack.length; i++) {
            if (FormEditableAPI.stack[i].Id == id && FormEditableAPI.stack[i].Item == item && FormEditableAPI.stack[i].Type == type && (culture == null || FormEditableAPI.stack[i].Culture == culture)) {
                FormEditableAPI.stack[i].Value = value;
                return;
            }
        }

        var o = new Object();
        o.Id = id;
        o.Item = item;
        o.Value = value;
        o.Culture = culture;
        o.Type = type;

        FormEditableAPI.stack.push(o);
    },

    GetValue: function (id, item) {
        FormEditableAPI.GetValue(id, item, null);
    },

    GetValue: function (id, item, culture) {
        for (var i = 0; i < FormEditableAPI.stack.length; i++) {
            if (FormEditableAPI.stack[i].Id == id && FormEditableAPI.stack[i].Item == item && (culture == undefined || FormEditableAPI.stack[i].Culture == culture)) {
                return FormEditableAPI.stack[i];
            }
        }
        return null;
    },

    GetValues: function () {
        FormEditableAPI.GetValues(null);
    },

    GetValues: function (type) {
        if (type) {
            var retVal = new Array();
            for (var i = 0; i < FormEditableAPI.stack.length; i++) {
                if (FormEditableAPI.stack[i].Type == type)
                    retVal.push(FormEditableAPI.stack[i]);
            }
        }

        return FormEditableAPI.stack;
    },

    Clear: function () {
        FormEditableAPI.Clear(null);
    },

    Clear: function (type) {

        if (type) {
            var l = FormEditableAPI.stack.length;
            for (var i = l; i > 0; i--) {
                if (FormEditableAPI.stack[i - 1].Type == type)
                    FormEditableAPI.stack.splice(i - 1, 1);
            }
        }
        else {
            FormEditableAPI.stack.splice(0, FormEditableAPI.stack.length);
            var v = FormEditableAPI.stack;
        }
    },

    ParseValue: function (type, pageId, formItem, valueObject, culture) {

        //get value from change list
        var id = jQuery(formItem).attr('name');

        var storeValue = this.GetValue(pageId, id, culture);

        if (storeValue != null) {
            FormEditableAPI.SetValue(formItem, storeValue.Value);
        }
        else if (valueObject != null) {
            // set value from backend entity
            var val = valueObject[id];
            if (val)
                FormEditableAPI.SetValue(formItem, val);
        }
    },

    SetValue: function (formItem, value) {
        if (formItem.type == "radio") {
            jQuery(formItem).filter('[value=' + value + ']').attr('checked', true);
        }
        else if (formItem.type == "checkbox") {
            if (value && (value == "true" || value == true))
                jQuery(formItem).attr('checked', 'checked');
            else
                jQuery(formItem).removeAttr('checked');
        }
        else
            jQuery(formItem).val(value);
    },

    ParseEditForm: function (itemId, culture, path, type) {

        var item;
        var o = new Object();
        o.ItemId = itemId;
        o.Culture = culture;

        var postdata = jQuery.toJSON(o);

        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            data: postdata,
            async: false,
            url: CommonAPI.BaseUrl + path,
            dataType: "json",
            success: function (res) {
                if (res) {
                    item = res;
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.responseText);
            }
        });

        jQuery('.auto_save').each(function () {
            FormEditableAPI.ParseValue(type, itemId, this, item, culture);
        });
    },


    SaveData: function (type, url) {

        var data = new Array();

        var items = FormEditableAPI.GetValues(type);

        for (var i = 0; i < items.length; i++) {
            var o = new Object();
            o.Key = items[i].Item;
            o.Value = items[i].Value;

            data.push(o);
        }
        url = CommonAPI.BaseUrl + url;

        if (FormEditableAPI.BackEndAddOrUpdate(data, url))
            FormEditableAPI.Clear(type);

    },

    DeleteContribution: function (list, id) {
        var url = CommonAPI.BaseUrl + 'Base/DeleteContributtion';
        return FormEditableAPI.BackEndDeleteRows(list, id, url);
    },

    BackEndDeleteRows: function (rows, idName, url, successMethod) {
        var guid = new Array();
        for (var i = 0; i < rows.length; i++) {
            guid.push(rows[i][idName])
        }
        FormEditableAPI.BackEndAddOrUpdate(guid, url, successMethod);
    },

    BackEndAddOrUpdate: function (data, url, successMethod, show) {
        var flag = false;

        var postdata = data ? jQuery.toJSON(data) : null;

        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            data: postdata,
            async: false,
            url: url,
            dataType: "json",
            success: function (res) {
                if (res) {
                    if (!show && jQuery.validator && jQuery.messager) {
                        jQuery.messager.show({
                            title: jQuery.validator.messages.confirm,
                            msg: jQuery.validator.messages.saveSuccessful,
                            showType: 'show',
                            timeout: 2000
                        });
                    }
                    if (successMethod)
                        successMethod(res);
                    flag = true;
                }
                else {
                    //alert(res);
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.responseText);
            }
        });
        return flag;
    },

    GetData: function (data, url) {
        var postdata = data ? jQuery.toJSON(data) : null;
        var result = undefined;

        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            data: postdata,
            async: false,
            url: url,
            dataType: "json",
            success: function (res) {
                result = res;
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.responseText);
            }
        });
        return result;
    },

    ReloadGrid: function (grid) {
        var options = grid.datagrid('options');
        grid.datagrid('reload', options.queryParams);
    },

    AddOrUpdateModal: function (winUrl, atrName ,row, grid) {
        jQuery(document.body).append('<div id="edit_window" style="width: auto; height: auto;"></div>');
        var href = CommonAPI.BaseUrl +  winUrl + '/' + (row != null ? row[atrName] : "");
        jQuery("#edit_window").window({ title: row == null ? easyui.texts.NewItem : easyui.texts.Edit, iconCls: row == null ? "icon-add" : "icon-edit", href: href, modal: true, collapsible: false, minimizable: false,
            maximizable: false, onClose: function () {
                //jQuery('#table_slots').datagrid("reload");
                grid.datagrid("reload");
                jQuery("#edit_window").window("destroy")
            }
        });
    },

    ShowWindow: function (href, title, iconCls, onClose, onLoad) {
        if (!iconCls)
            iconCls = 'icon-arronix';
        var win = jQuery('<div id="edit_window" style="width: auto; height: auto;"></div>');
        jQuery(document.body).append(win);
        win.window({ title: title, iconCls: iconCls, href: href, modal: true, collapsible: false, minimizable: false,
            maximizable: false,
            onBeforeClose: function () {
                if (onClose)
                    onClose();
            },
            onClose: function () {
                jQuery("#edit_window").window("destroy");
            },
            onLoad: function () {
                var doc = jQuery(window);
                win.window('move', { top: ((doc.height() - win.height()) / 2) + doc.scrollTop(), left: (doc.width() - win.width()) / 2 });
                if (onLoad)
                    onLoad();
            }
        });
    }
};

(function ($) {
    $.format = (function () {

        var parseMonth = function (value) {

            switch (value) {
                case "Jan":
                    return "01";
                case "Feb":
                    return "02";
                case "Mar":
                    return "03";
                case "Apr":
                    return "04";
                case "May":
                    return "05";
                case "Jun":
                    return "06";
                case "Jul":
                    return "07";
                case "Aug":
                    return "08";
                case "Sep":
                    return "09";
                case "Oct":
                    return "10";
                case "Nov":
                    return "11";
                case "Dec":
                    return "12";
                default:
                    return value;
            }
        };

        var parseTime = function (value) {
            var retValue = value;
            if (retValue.indexOf(".") !== -1) {
                retValue = retValue.substring(0, retValue.indexOf("."));
            }

            var values3 = retValue.split(":");

            if (values3.length === 3) {
                hour = values3[0];
                minute = values3[1];
                second = values3[2];

                return {
                    time: retValue,
                    hour: hour,
                    minute: minute,
                    second: second
                };
            } else {
                return {
                    time: "",
                    hour: "",
                    minute: "",
                    second: ""
                };
            }
        };

        return {

            parseDate : function (value, format) {
                var dt = value.split(" ");
                if (dt.length < 1)
                    return new Date();

                var arr = dt[0].split(".");
                if (arr.length < 3)
                    return new Date();

                try {
                    var day = arr[0];
                    var month = arr[1] - 1;
                    var year = arr[2];
                    return new Date(year, month, day);
                }
                catch (exc) {
                    return new Date();
                }
            },

            date: function (value, format) {
                //value = new java.util.Date()
                //2009-12-18 10:54:50.546
                if(!value)
                    return value;
                try {
                    var year = null;
                    var month = null;
                    var dayOfMonth = null;
                    var time = null; //json, time, hour, minute, second
                    if (typeof value.getFullYear === "function") {
                        year = value.getFullYear();
                        month = value.getMonth() + 1;
                        dayOfMonth = value.getDate();
                        time = parseTime(value.toTimeString());
                    } else {
                        var values = value.split(" ");

                        switch (values.length) {
                            case 6: //Wed Jan 13 10:43:41 CET 2010
                                year = values[5];
                                month = parseMonth(values[1]);
                                dayOfMonth = values[2];
                                time = parseTime(values[3]);
                                break;
                            case 2: //2009-12-18 10:54:50.546
                                var values2 = values[0].split("-");
                                year = values2[0];
                                month = values2[1];
                                dayOfMonth = values2[2];
                                time = parseTime(values[1]);
                                break;
                            default:
                                return value;
                        }
                    }

                    var pattern = "";
                    var retValue = "";

                    for (i = 0; i < format.length; i++) {
                        var currentPattern = format.charAt(i);
                        pattern += currentPattern;
                        switch (pattern) {
                            case "dd":
                                retValue += dayOfMonth;
                                pattern = "";
                                break;
                            case "MM":
                                retValue += month;
                                pattern = "";
                                break;
                            case "yyyy":
                                retValue += year;
                                pattern = "";
                                break;
                            case "HH":
                                retValue += time.hour;
                                pattern = "";
                                break;
                            case "hh":
                                retValue += (time.hour === 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12);
                                pattern = "";
                                break;
                            case "mm":
                                retValue += time.minute;
                                pattern = "";
                                break;
                            case "ss":
                                retValue += time.second;
                                pattern = "";
                                break;
                            case "a":
                                retValue += time.hour > 12 ? "PM" : "AM";
                                pattern = "";
                                break;
                            case " ":
                                retValue += currentPattern;
                                pattern = "";
                                break;
                            case "/":
                                retValue += currentPattern;
                                pattern = "";
                                break;
                            case ":":
                                retValue += currentPattern;
                                pattern = "";
                                break;
                            default:
                                if (pattern.length === 2 && pattern.indexOf("y") !== 0) {
                                    retValue += pattern.substring(0, 1);
                                    pattern = pattern.substring(1, 2);
                                } else if ((pattern.length === 3 && pattern.indexOf("yyy") === -1)) {
                                    pattern = "";
                                }
                        }
                    }
                    return retValue;
                } catch (e) {
                    //console.log(e);
                    return value;
                }
            }
        };
    } ());
} (jQuery));
