﻿//#region -- Prototypes
if (!"".trim) {
    String.prototype.trim = function() {
        return this.replace(/^\s*/, "").replace(/\s*$/, "");
    }
}
//#endregion -- Prototypes

//#region -- Egghead
//#region -- Egghead base
Egghead = {
    //#region -- properties
    application: {
        path: function() { if (baseURL != null) { return baseURL; } else { return window.location.protocol + "//" + window.location.hostname + window.location.port; } }
    }
	, debug: { petedit: 0, ajaxloaderror: 0 }
	, isdebug: true
	, templates: {}
	, defaults: {
	    dialogcnt: function() {
	        if ($("#dialogContainer").length == 0) {
	            $("body").append('<div id="dialogContainer"></div>');
	        }
	        return $("#dialogContainer");
	    }
	}
    //#endregion -- properties

    //#region -- fn
	, fn: {
	    mergeOptions: function() { }
		, dialog: function() { }
		, isInt: function(evt) {
		    var charCode = (evt.which) ? evt.which : event.keyCode
		    if (charCode > 31 && (charCode < 48 || charCode > 57)) return false;
		    if (charCode == 13) return false;
		    return true;
		}
		, dictToJson: function(dictParsed) {
		    var json = {};
		    $.each(dictParsed, function(i, item) { json[item.Key] = item.Value; });
		    return json;
		}
		, dictToGroupedOptions: function(dict) {
		    var options = "";
		    $.each(dict, function(gi, group) {
		        options += "<optgroup label='" + group.Key + "'>";
		        $.each(group.Value, function(i, item) {
		            options += "<option value='" + item.Key + "' group='" + group.Key + "'>" + item.Value + "</option>";
		        });
		        options += "</optgroup>";
		    });
		    return options;
		}
		, formToJson: function(form) {
		    var json = {};
		    for (var i = 0; i < form.length; i++) {
		        var el = form[i];
		        var val = $(el).val();
		        if (el.type && el.type === "checkbox") {
		            val = el.checked;
		        }
		        json[el.name] = val;
		    }
		    return json;
		}
		, intColumnEdit: function(pattern, container) { }
		, checkEmailSyntax: function(email) { return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/.test(email); }
		, setDebug: function(info) { var dg = $("#eggheadDebug span"); if (dg.length == 0) { $("body").append('<div id="eggheadDebug"><span></span></div>'); dg = $("#eggheadDebug span"); $("#eggheadDebug").dialog({ modal: false, title: "debug", width: 200, height: 800, position: ["left"] }); } dg.html(info + "<br />"); }
		, addDebug: function(info) { var dg = $("#eggheadDebug span"); if (dg.length == 0) this.setDebug(info); else dg.html(dg.html() + info + "<br />"); }
	}
    //#endregion -- fn

    //#region -- services
	, services: {
	    ajax: { path: function() { }
			, load: function() { }
			, ucLoad: function() { }
			, ucUpdate: function() { }
	    }
	}
    //#endregion -- services

    //#region -- busy 
	, busy: { obj: $()
		, items: []
		, visible: false
		, hide: function() {
		    Egghead.busy.visible = false;
		    Egghead.busy.obj.hide();
		    Egghead.busy.items = []; //reset
		}
		, show: function() {
		    if (!Egghead.busy.visible && Egghead.busy.items.length) {
		        Egghead.busy.obj.show();
		        Egghead.busy.visible = true;
		    }
		}
		, subscribe: function(id) {
		    if (id) {
		        Egghead.busy.items.push(id);
		        Egghead.busy.show();
		    }
		}
		, unsubscribe: function(id) {
		    var a = [], removed = false;
		    for (var i = 0; i < Egghead.busy.items.length; i++) {
		        if (!removed && Egghead.busy.items[i] === id) removed = true
		        else a.push(Egghead.busy.items[i]);
		    }
		    Egghead.busy.items = a;
		    if (Egghead.busy.visible && !Egghead.busy.items.length) Egghead.busy.hide();
		}
		, move: function(e) {
		    if (Egghead.busy.visible) {
		        Egghead.busy.obj.css({ "left": e.pageX + 8, "top": e.pageY - 10 });
		    }
		}
	}
    //#endregion -- busy

    //#region -- controls
	, controls: {
	    //#region -- datepicker
	    datepicker: function(jqPattern, container) {
	        $(jqPattern, container) //z-index fixed per class, z-index + possition: relative, absolute, fixed
			.datepicker({
			//beforeShow: function(input, inst){ }
});
	    }
	    //#endregion -- datepicker
	}
    //#endregion -- controls
};
//#endregion -- Egghead base 

//#region -- fn 
//#region -- Egghead.fn.mergeOptions(options, extended)
Egghead.fn.mergeOptions = function(options, extended) {
    if (extended) for (var key in extended) {
        if (extended.hasOwnProperty(key)) {
            if (options.hasOwnProperty(key) && (typeof extended[key] === "object") && (typeof options[key] === "object")) {
                Egghead.fn.mergeOptions(options[key], extended[key]);
            }
            else {
                options[key] = extended[key];
            }
        }
    }
    return options;
};
//#endregion -- Egghead.fn.mergeOptions(options, extended)

//#region -- Egghead.fn.dialog(options, html)
Egghead.fn.dialog = function(options, html) {
    var defaults = { autoOpen: true, height: 'auto', width: 570
		, modal: true
		, title: "Dialog"
		, buttons: {}
		, close: function() { $(this).empty(); }
    };

    Egghead.fn.mergeOptions(defaults, options);

    if ($("#dialogContainer").length > 0) {
        $("#dialogContainer").remove();
    }

    return Egghead.defaults.dialogcnt()
		.empty().html(html)
		.dialog(defaults);
}
//#endregion -- Egghead.fn.dialog(options, html)

//#region -- Egghead.fn.intColumnEdit(pattern, container)
Egghead.fn.intColumnEdit = function(pattern, container) {
    return $(pattern, container)
	.keypress(Egghead.fn.isInt)
	.keydown(function(event) {
	    if (event.keyCode != 38 && event.keyCode != 40) return;
	    var inputs = $(pattern);
	    for (var i = 0; i < inputs.length; i++) {
	        if ($(inputs[i]).attr("id") == $(this).attr("id")) {
	            if (event.keyCode == 38) if (i > 0) $(inputs[i - 1]).focus();
	            if (event.keyCode == 40) if (inputs.length > i) $(inputs[i + 1]).focus();
	        }
	    }
	})
	.focus(function() { if ($(this).val() == 0) $(this).val(''); })
	.blur(function() { if ($(this).val() == '') $(this).val('0'); });
}
//#endregion -- Egghead.fn.intColumnEdit(pattern, container)

//#endregion -- fn 

//#region -- services
Egghead.services.ajax.path = function() { return Egghead.application.path() + "/AjaxServices.asmx"; };

//#region -- load(options: {service_fn, data:stringify'ied}) - success(result.d, srv_result), error(msg.responseText)
Egghead.services.ajax.load = function(options) {
    var defaults = { type: 'POST'
		, url: Egghead.services.ajax.path() + options.service_fn
        //,data: {}
		, contentType: "application/json; charset=utf-8"
		, dataType: "json"
		, success: function(result) { }
		, error: function(msg) { alert(msg.responseText); } // default one

		, busy: "default"
		, beforeSend: function(rq) {
		    Egghead.busy.subscribe(this.busy);
		}
		, complete: function(rq) {
		    Egghead.busy.unsubscribe(this.busy);
		}
    };

    Egghead.fn.mergeOptions(defaults, options);

    if (Egghead.debug.ajaxloaderror) defaults.error = function(msg) { alert(msg.responseText); };

    $.ajax(defaults);

    return this;
};
//#endregion -- load

//#region -- ucLoad(options: { controlPath: 'folder/control', data: {}, success:(result.d), error })
Egghead.services.ajax.ucLoad = function(options) {
    var defaults = { service_fn: "/RenderUserControl", controlPath: "" }
    Egghead.fn.mergeOptions(defaults, options);
    defaults.data = JSON.stringify({ controlPath: defaults.controlPath
		, options: defaults.data
    });
    return Egghead.services.ajax.load(defaults);
};
//#endregion -- ucLoad

//#region -- ucUpdate(options: { controlPath: 'folder/control', data: {}, success:(json, srv_result), error })
Egghead.services.ajax.ucUpdate = function(options) {
    var defaults = { service_fn: "/RenderUserControlUpdate", controlPath: "" }
    Egghead.fn.mergeOptions(defaults, options);
    defaults.data = JSON.stringify({ controlPath: defaults.controlPath
		, options: defaults.data
    });

    defaults.clientSuccess = options.success;
    defaults.success = function(msg, result) {
        var dict = JSON.parse(msg.d);
        //if(json.result === "success")
        return defaults.clientSuccess(Egghead.fn.dictToJson(dict), result); //data, service result
    }
    return Egghead.services.ajax.load(defaults);
};
//#endregion -- ucUpdate

//#region -- getdata(options: { controlName: 'className', data: {}, success:(json, result, srv_result), error })
Egghead.services.ajax.getdata = function(options) {
    var defaults = { service_fn: "/GetDataJson", controlName: "" };
    Egghead.fn.mergeOptions(defaults, options);
    defaults.data = JSON.stringify({ controlName: defaults.controlName
		, options: defaults.data
    });

    defaults.clientSuccess = options.success;
    defaults.success = function(msg, result) {
        var json = JSON.parse(msg.d);
        //if(json.result === "success")
        return defaults.clientSuccess(Egghead.fn.dictToJson(json.data), json.result, result); //data, service result, ajax result
    }
    return Egghead.services.ajax.load(defaults);
}
//#endregion -- getdata

//#endregion -- services

//#endregion -- Egghead

//#region === (jQuery.extend)

//#region -- serializeFormToJson (jQuery.extend)
jQuery.extend({
    serializeFormToJson: function(form) {
        var json = {};
        for (var i = 0; i < form.length; i++) {
            var el = form[i];
            var val = $(el).val();
            if (el.type && el.type === "checkbox") {
                val = el.checked;
            }
            json[el.name] = val;
        }
        var res = JSON.stringify(json);
        return res;
    }
});
//#endregion -- serializeFormToJson

//#region -- dictionaryToJson 
jQuery.extend({
    dictionaryToJson: function(dictUnparsed) {
        var dic = JSON.parse(dictUnparsed);
        var json = {};
        $.each(dic, function(i, item) {
            json[item.Key] = item.Value;
        });
        return json;
    }
		, pDictionaryToJson: function(dictParsed) {
		    var json = {};
		    $.each(dictParsed, function(i, item) {
		        json[item.Key] = item.Value;
		    });
		    return json;
		}
});
//#endregion -- dictionaryToJson

//#region -- dictionaryToOptions
jQuery.extend({
    dictionaryToOptions: function(dictUnparsed) {
        var dic = JSON.parse(dictUnparsed);
        var options = "";
        $.each(dic, function(i, item) {
            options += "<option value='" + item.Key + "'>" + item.Value + "</option>";
        });
        return options;
    }
});
//#endregion -- dictionaryToOptions

//#region -- dictionaryToGroupedOptions
jQuery.extend({
    dictionaryToGroupedOptions: function(dictUnparsed) {
        var dic = JSON.parse(dictUnparsed);
        var options = "";
        $.each(dic, function(gi, group) {
            options += "<optgroup label='" + group.Key + "'>";
            $.each(group.Value, function(i, item) {
                options += "<option value='" + item.Key + "' group='" + group.Key + "'>" + item.Value + "</option>";
            });
            options += "</optgroup>";
        });
        return options;
    }
});
//#endregion -- dictionaryToGroupedOptions

//#region -- groupOptions
jQuery.extend({
    groupOptions: function(id, group) {
        if (!group) group = "group";
        id = "#" + id;
        var a = {};
        $(id + " [" + group + "]").each(function() {
            g = $(this).attr(group);
            if (!a[g]) a[g] = true;
        });
        $.each(a, function(key, val) {
            $(id + " [" + group + "='" + key + "']").wrapAll("<optgroup label='" + key + "'>");
        });
        return true;
    }
});
//#endregion -- groupOptions

//#endregion === (jQuery.extend)



//#region -- addOnSubmit
(function($) {
    $.fn.extend({
        addOnSubmit: function(newFunction) {

            return this.each(function() {
                if (!this.onsubmithandler) {

                    this.onsubmithandler = [];
                    if (this.onsubmit) {
                        if (typeof this.onsubmit === "function") {
                            this.onsubmithandler.push(this.onsubmit);
                        }
                        else {
                            this.onsubmithandler.push(new Function(this.onsubmit));
                        }
                        $(this).removeAttr("onsubmit");
                    }

                    this.onsubmit = function() {
                        for (var i = 0; i < this.onsubmithandler.length; i++) {
                            this.handlevent = this.onsubmithandler[i];
                            if (this.handlevent()) {
                                continue;
                            }
                            return false;
                        }
                        return true;
                    }

                }

                this.onsubmithandler.push(newFunction);

                return this;
            });

        }
    })
})(jQuery);
//#endregion -- addOnSubmit




(function($) {
    $.fn.extend({
        raiseQuoteDialog: function(options) {
            var defaults = {
                controlPath: 'RaiseQuote',
                quoteid: 0,
                error:
		        function(response, result) {
		            alert(response.responseText);
		        },
                title: 'Raise a quote'
            }

            Egghead.fn.mergeOptions(defaults, options);
            var container = this;

            container.options = defaults;


            //#region -- updateDataEvent
            var updateDataEvent = function() {



                //#region -- close dialog
                var closeDialog = function() {
                    //To Close Current Dialog
                    Egghead.defaults.dialogcnt().empty();
                    Egghead.defaults.dialogcnt().dialog('close');
                }
                //#endregion -- close dialog


                var cnt = Egghead.defaults.dialogcnt();
                var button = $(this);

                var data = new Object();
                data.quoteid = container.options.quoteid;
                data.workdescription = cnt.find('[id$="_txtWorkDescription"]').val();
                data.quotationsubtotal = cnt.find('[id$="_txtQuotationSubtotal"]').val();
                data.quotationsubtotal = cnt.find('[id$="_txtQuotationSubtotal"]').val();
               // data.agreetotermsandconditions = cnt.find('[id$="_chkAgreeTermsAndConditions"]')[0].checked;

                //data = { pids: pids.join("_"), productid: container.options.productid };
                //data = Egghead.fn.formToJson($("[name]", $(cnt)));
                //data.buttonevent = button.attr("name");
                //data.productid = container.options.productid;

                Egghead.services.ajax.ucUpdate({
                    controlPath: container.options.controlPath
                                    , data: data
                                    , error: function(response, result) {
                                        alert("Error occurred");
                                    }
                                    , success: function(response, result) {
                                        if (response.result == "success") {
                                            closeDialog();
                                            $(document).find('*[quoteid]').each(function(index) {
                                                if ($(this).attr("quoteid") == data.quoteid) {
                                                    $(this).show();
                                                }
                                            });
                                            $(document).find('*[hidequoteid]').each(function(index) {
                                                if ($(this).attr("hidequoteid") == data.quoteid) {
                                                    $(this).hide();
                                                }
                                            });
                                        }
                                        else {
                                            alert(response.message);
                                        }
                                    }
                });

                return true;
            };
            //#endregion -- updateDataEvent





            this.initialize = function() {
                Egghead.services.ajax.ucLoad({
                    controlPath: container.options.controlPath
                    , data: { quoteid: container.options.quoteid }
                    , error: container.options.error
                    , success: function(response, result) {
                        if (result === "success") {
                            Egghead.fn.dialog({ title: "Raise a Quote", width: 500, height: 400 }, response.d);
                            var cntbuttons = Egghead.defaults.dialogcnt();
                            $("#btnSendQuote").click(updateDataEvent);

                        }
                    }
                });

            }

            /* All javascript will come here which will you going to add in below steps. */

            this.initialize();
            return this;
        }
    })
})(jQuery);








//#region -- Initialize
$(function() {

    //#region -- ajax busy trailer
    $("body").append('<div id="ajaxBusy" style="z-index: 2000000;"><p>Please wait...</p></div>');
    Egghead.busy.obj = $("#ajaxBusy").css({
        display: "none"
		, margin: "0px"
		, paddingLeft: "0px"
		, paddingRight: "0px"
		, paddingTop: "0px"
		, paddingBottom: "0px"
		, position: "absolute"
		, left: "3px"
		, top: "3px"
		, width: "auto"
    });

    $(document).ajaxStart(Egghead.busy.show)
		.ajaxStop(Egghead.busy.hide);

    $(document).mousemove(Egghead.busy.move);

    //#endregion -- ajax busy trailer
});

//#endregion -- Initialize

//#region -- firstSessionInformation
(function($) {
    $.fn.extend({
        firstSessionInformation: function(options, contractorToAdd) {
            var defaults =
                {
                    controlPath: 'FirstSessionInformation'
                    , sessionfirst: 'true'
                    , error:
		            function(response, result) {
		                alert(result);
		                alert(response.responseText);
		            }
                }

            Egghead.fn.mergeOptions(defaults, options);
            var container = this;
            container.options = defaults;

            this.initialize = function() {
                Egghead.services.ajax.ucLoad({
                    controlPath: defaults.controlPath
                    , data: { sessionfirst: container.options.sessionfirst }
                    , error: function(response, result) {
                        //alert(result);
                    }
                    , success: function(response, result) {
                        if (result === "success") {
                            Egghead.fn.dialog({ title: "", width: 500, height: 400 }, response.d);
                            var cntbuttons = Egghead.defaults.dialogcnt();
                            $("#btnFirstInfo").click(function() { cntbuttons.empty().dialog('close'); updateMiniCart('add', contractorToAdd, 'divMiniCart'); });
                        }
                    }
                });
            }

            this.initialize();
            return this;
        }
    })
})(jQuery);
//#endregion -- firstSessionInformation

//#region -- firstSessionInformation
(function($) {
    $.fn.extend({
        firstEnquirySessionInformation: function(options, sender) {
            var defaults =
                {
                    controlPath: 'FirstEnquirySessionInformation'
                    , sessionfirst: 'true'
                    , error:
		            function(response, result) {
		                alert(result);
		                alert(response.responseText);
		            }
                }

            Egghead.fn.mergeOptions(defaults, options);
            var container = this;
            container.options = defaults;

            this.initialize = function() {
                Egghead.services.ajax.ucLoad({
                    controlPath: defaults.controlPath
                    , data: { sessionfirst: container.options.sessionfirst }
                    , error: function(response, result) {
                        //alert(result);
                    }
                    , success: function(response, result) {
                        if (result === "success") {
                            Egghead.fn.dialog({ title: "", width: 500, height: 400 }, response.d);
                            var cntbuttons = Egghead.defaults.dialogcnt();
                            $("#btnFirstInfo").click(function() { cntbuttons.empty().dialog('close'); window.location = $('#' + sender).attr('navigationaddress'); ; });
                        }
                    }
                });
            }

            this.initialize();
            return this;
        }
    })
})(jQuery);
//#endregion -- firstSessionInformation

//#region -- ShowErrorPopup
(function($) {
    $.fn.extend({
        ShowErrorPopup: function(options) {
            var defaults =
                {
                    controlPath: 'ErrorPopup'
                    , sessionfirst: 'true'
                    , error:
		            function(response, result) {
		                alert(result);
		                alert(response.responseText);
		            }
                }

            Egghead.fn.mergeOptions(defaults, options);
            var container = this;
            container.options = defaults;

            this.initialize = function() {
                Egghead.services.ajax.ucLoad({
                    controlPath: defaults.controlPath
                    , data: { sessionfirst: container.options.sessionfirst }
                    , error: function(response, result) {
                        alert(result);
                    }
                    , success: function(response, result) {
                        if (result === "success") {
                            Egghead.fn.dialog({ title: "", width: 500, height: 400 }, response.d);

                            $('#lblErrorMessage').html(container.options.ErrorText);

                            var cntbuttons = Egghead.defaults.dialogcnt();
                            $("#btnFirstInfo").click(function() { cntbuttons.empty().dialog('close'); });
                        }
                    }
                });
            }

            this.initialize();
            return this;
        }
    })
})(jQuery);
//#endregion -- ShowErrorPopup
