﻿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();
    },
    ShowPromptWindow: function (text) {
        jQuery.modaldialog.remove();
        jQuery.modaldialog.prompt(text, {
            showClose: false,
            title: '',
            width: 200
        });
    },
    HidewPromptWindow: function () {
        jQuery.modaldialog.hide();
    },

    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 = CommonAPI.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 = CommonAPI.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 = CommonAPI.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;
        }
    },
    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: ""
            };
        }
    }

};

var FormEditableAPI =
{
    stack: new Array(),


    FormCulture: function (culture) {
        if (jQuery.cookie) {
            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);
    },

    AddAttachment: function (tableId, o, delTxt, delFnc) {
        var tr = jQuery(tableId + ' tr:last');
        var n = jQuery('<tr align="center" style=""><td><img src="" alt=""></td><td><input type="text" value="" name="" class="input-wide localize"></td><td><a onclick="' + delFnc + '" icon="icon-delete" plain="true" class="easyui-linkbutton l-btn l-btn-plain" rel="" href="javascript:"><span class="l-btn-left"><span class="l-btn-text icon-delete" style="padding-left: 20px;"></span></span></a></td></tr>');
        jQuery('img', n).attr('src', o.Thumb);
        jQuery('input', n).attr('name', o.AttachmentId);
        jQuery('a', n).attr('rel', o.AttachmentId);
        jQuery('span.l-btn-text', n).html(delTxt);

        tr.after(n);
    },

    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;
        }
    },

    CultureBoxToTabs: function (fnc) {
        var selCul = jQuery('<li class="no-border"></select></li>');

        var culture = jQuery('#culture');

        selCul.append(culture);

        jQuery('.layout-panel-center .tabs').append(selCul);

        culture.combobox({
            editable: false
        });

        if (FormEditableAPI.FormCulture()) {
            culture.combobox('setValue', FormEditableAPI.FormCulture());
            
        }

        culture.combobox({
            onChange: function (newValue, oldValue) {
                FormEditableAPI.FormCulture(newValue);
                if (fnc)
                    fnc(newValue);
            }
        });

        FormEditableAPI.SetCulture(culture.combobox('getValue'));

        return culture;
    },

    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);
        });
    },


    ApplyError: function (form, values) {
        var validator = jQuery(form).validate();
        for (i = 0; i < values.length; i++) {
            var obj = {};
            obj[values[i].Key] = values[i].Value.Errors[0].ErrorMessage;
            validator.showErrors(obj);
        };
    },

    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 != undefined) {
                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;
    },

    PosSave: function (res) {
        if (res && res.Success == true) {
            FormEditableAPI.Clear();
            if (res.OldId == "00000000-0000-0000-0000-000000000000") {
                window.location = window.location + res.EntityId;
            }
            return true;
        }
        else {
            if (res) {
                alert(res.Message);
            }
            else {
                alert('Error');
            }
            return false;
        }
    },

    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) {
        grid.datagrid('clearSelections');
        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 () {
                FormEditableAPI.ReloadGrid(grid);
                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();
            }
        });
    },
    CloseWindow: function () {
        jQuery('#edit_window').window("close");
    }
};

(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));
