var Globals = {};

var cpm = {}; // global object for modules
var cpp = {}; // global object for plugins
var cpw = {}; // global object for widgets
var cpt = {}; // global object for themes

//------------------------------------------------//
var Util = {
    createCPObject: function(objName){
        var arr = objName.split('.');

        var objStr = '';
        $(arr).each(function(i){
            var objNameTemp = arr[i];
            var objName = objStr + objNameTemp;
            eval("obj = " + objName);
            if (obj == undefined) {
                eval(objName + " = {}");
            }
            objStr += objNameTemp + '.';
        });
    },

    expose: function(obj){
        if ($('#cpScope').val() == 'www'){
            /*
    	    var obj = obj.expose({color: '#789', lazy: true});

    	    // enable exposing on the wizard
    	    obj.click(function() {
    	    	$(this).expose().load();
    	    });
    	    */
    	}
    },

    addCommasToNumber: function(nStr){
    	nStr += '';
    	x = nStr.split('.');
    	x1 = x[0];
    	x2 = x.length > 1 ? '.' + x[1] : '';
    	var rgx = /(\d+)(\d{3})/;
    	while (rgx.test(x1)) {
    		x1 = x1.replace(rgx, '$1' + ',' + '$2');
    	}
    	return x1 + x2;
    },

    changeLangDropdown: function(url, hasSEO){
        var lang = document.getElementById('lang').value;
        var link = '';
        if (hasSEO == 1){
            link = '/' + lang + '/' + url;
        } else {
            link = url + '&lang=' + lang;
        }
        document.location = link;
    },

    getScrollForUIDialog: function(text, options) {
        var height = options.height;
        height -= 100;
        var selectedSet = $('<div>')
                          .append($('<div>' + text + '</div>')
                                  .css({'overflow-y': 'auto', 'width': '94%', 'height': height + 'px'})
                           );
        return selectedSet;
    },

    initDialog: function() {
        //just to make sure we are not dealing with the unintended (old used) div for the dialog
        $("div.popcontents").closest('.ui-dialog:hidden').remove();
        //$("div.popcontents").remove();

        var dialogCount = $('div.popcontents').length;
        var text = 'dialog';
        if (dialogCount == 0) {
            text = 'dialog';
        } else {
            text = 'dialog' + dialogCount;
        }

        $('body').append("<div id='" + text + "' class='popcontents'><div>");

        //returnd dialog div id
        return '#' + text;
    },

    initDialog2: function() {
        var dialogCount = $('div.popcontents').length;
        var text = 'dialog';
        if (dialogCount == 0) {
            text = 'dialog';
        } else {
            text = 'dialog' + dialogCount;
        }

        $('body').append("<div id='" + text + "' class='popcontents'><div>");

        //returnd dialog div id
        return '#' + text;
    },

    closeAllDialogs: function() {
        $('#dialog').dialog('close');
        $('#dialog').dialog('destroy');
    },

    closeTopMostDialog: function() {
        /** this function is not completed **/
        $('div.popcontents').livequery(function(){
            var dialogCount = $(this).length;

            if (dialogCount == 1) {
                dialogId = 'dialog';
            } else {
                dialogId = 'dialog' + dialogCount;
            }
        });
        //$('#' + dialogId).dialog('close');
        //$('#' + dialogId).dialog('destroy');
    },

    dialogDefaults: {bgiframe: true,
                     modal: true,
                     overlay: {opacity:0.8, background:'red'}
    },

    showProgressInd: function(message) {

        if ($('#progressInd').length > 0){
            return;
        }

        if (message == undefined) {
            message = Lang.get('cp_lbl_processing', 'Processing...');
        }
        var width = 100;
        var left = (screen.width-width)/2;
        var top = $(window).scrollTop();

        $('body')
        .append("<div id='progressInd' class='progressInd'><div></div></div>");
        $('#progressInd')
        .addClass('ui-corner-bl')
        .addClass('ui-corner-br');
        $('#progressInd')
        .css('left', left + 'px')
        .css('top', top + 'px');
        $('#progressInd div').html(message);
    },

    hideProgressInd: function() {
        $('#progressInd').remove();
        $('.progressInd').each(function(){
            $(this).remove();
        });
    },

    alert: function(text, callback, dialogTitle) {

        if (!dialogTitle){
            dialogTitle = '';
        }

        var dialogId = Util.initDialog2();
        $(dialogId).html(text);
        var xButtons = {};
        xButtons['OK'] = function() {
            $(this).dialog('close');
            $(this).dialog('destroy');

            if (callback) {
                callback.call();
            }
        };

        $(dialogId).dialog(
            $.extend(Util.dialogDefaults, {
                height: 200,
                width: 350,
                title: dialogTitle,
                buttons: xButtons,
                beforeclose: function(){}
            })
        );
    },

    showSimpleMessageInDialog: function(msg) {

        var id = Util.initDialog2();
        $(id).html(msg);

        var xButtons = {};

        xButtons[Lang.data.cp_lbl_close] = function() {
            $(this).dialog('close');
            $(this).dialog('destroy');
        };

        var x_dialog = $(id).dialog(
            $.extend(Util.dialogDefaults, {
                buttons: xButtons
            })
        );
    },

    openDialogForLink: function(dialogTitle, w, h, showCloseBtn, extraParamObj) {
        exp = $.extend({
             url: ''
            ,beforeCloseFn: null
            ,afterOpen: null
            ,useIframe: false
            ,validationJsMethod: ''
        }, extraParamObj || {});

        if (!w){
           w = '800';
        }

        if (!h){
           h = 'auto';
        }

        var xButtons = {};

        if (showCloseBtn){
            xButtons[Lang.data.cp_lbl_close] = function() {
                $(this).dialog('close');
                $(this).dialog('destroy');
            };
        }

        if (exp.url) {
            url = exp.url;
        } else {
            if ($(this).attr('url')){
                url = $(this).attr('url');
            } else {
                url = $(this).attr('href');
                if (url == "" || url == "javascript:void(0)" || url == "javascript:void(0);"  || url == undefined) {
                    url = $(this).attr('link');
                }
            }
        }

        Util.showProgressInd();
        if (exp.validationJsMethod) {
            eval('var validationJsMethod =' + exp.validationJsMethod);
            var validationSuccess = validationJsMethod.call();
            if (!validationSuccess) {
                Util.hideProgressInd();
                return;
            }
        }

        var dlgOptions = $.extend(Util.dialogDefaults, {
             width: w
            ,height: h
            ,title: dialogTitle
            ,closeOnEscape: false
            ,buttons: xButtons
            ,beforeclose: function(e, ui) {
                if(exp.beforeCloseFn) {
                    exp.beforeCloseFn.call();
                }
        	}
        	,open: function(){
        	    var dialogHt = $(this).closest('.ui-dialog').height();
        	    var windowHt =  $(window).height();

        	    if (h == 'auto' && dialogHt > windowHt){
        	        $(this).height(windowHt-50);
                } else if (h == 'auto' && dialogHt < 250){
                    $(this).height(250);
        	    }
        	}
            ,close: function() { $(this).remove(); }
        });

        var dlgId = Util.initDialog();
        if (exp.useIframe) {
            var iframeId = dlgId + 'Iframe';
            var iframeText = "<iframe id='" + iframeId + "' width='100%' height='99%' " +
                             "marginWidth='0' marginHeight='0' frameBorder='0' scrolling='auto' src='" + url + "' />";
            $(dlgId).html(iframeText).dialog(dlgOptions);
            //$('#' + iframeId).attr('src', url);
            //console.log(url);
            Util.hideProgressInd();

        } else {
            $.get(url, function(data){
                $(dlgId).html(data);

                if(exp.afterOpen) {
                    exp.afterOpen.call();
                }

                var x_dialog = $(dlgId).dialog(dlgOptions);
                Util.hideProgressInd();
            });
        }
    },

    confirm: function(text, callback, options) {
        var settings = jQuery.extend({
             btn1Label: 'OK'
            ,btn2Label: 'Cancel'
        }, options);

        var dialogId = Util.initDialog();
        $(dialogId).html(text);

        var xButtons = {};
        xButtons[settings.btn1Label] = function() {
            $(this).dialog('close');
            $(this).dialog('destroy');

            if (callback) {
                callback.call(this, settings.btn1Label);
            }
        };
        xButtons[settings.btn2Label] = function() {
            $(this).dialog('close');
            $(this).dialog('destroy');
        };

        $(dialogId).dialog(
            $.extend(Util.dialogDefaults, {
                height: 200,
                width: 350,
                buttons: xButtons
            })
        );
    },

    openFormInDialog: function(formName, dialogTitle, w, h, opts) {
        if (!w){
           w = 450;
        }
        if (!h){
           h = 400;
        }

        var dialogId = Util.initDialog();
        var defaults = {
             beforeCloseFn: null
            ,url: null
            ,validate: true
            ,submitBtnText: Lang.get('cp_lbl_submit', 'Submit')
            ,cancelBtnText: Lang.get('cp_lbl_cancel', 'Cancel')
            ,buttons: {}
            ,dlgClass: 'dlg-' + formName //ex: dlg-registerForm
        };
        defaults.buttons = [
            {
                 click: function() {
                    $(dialogId).dialog('close');
                    $(dialogId).dialog('destroy');
                    $(dialogId).remove();
                 }
                ,'class': 'btn-cancel'
                ,text: defaults.cancelBtnText
            },
            {
                 click: function() {
                     $('#' + formName).submit();
                 }
                ,'class': 'btn-submit'
                ,text: defaults.submitBtnText
            }
        ];

        opts = $.extend({}, defaults, opts);

        var url = '';
        if (opts.url) {
            url = opts.url;
        } else {
            if ($(this).attr('url')){
                url = $(this).attr('url');
            } else {
                url = $(this).attr('href');
                if (url == "" || url == "javascript:void(0)" || url == "javascript:void(0);"  || url == undefined) {
                    url = $(this).attr('link');
                }
            }
        }
        Util.showProgressInd();

        $.get(url, function(data){
            $(dialogId).html(data);
            var x_dialog = $(dialogId).dialog(
                $.extend(Util.dialogDefaults, {
                     width: w
                    ,height: h
                    ,title: dialogTitle
                    ,buttons: opts.buttons
                    ,close: function() { $(this).remove(); }
                    ,beforeclose:function(e, ui){
                        if(opts.beforeCloseFn) {
                            opts.beforeCloseFn.call();
                        }
                    }
                    ,open:function(e, ui){
                        if (opts.onOpenFn) {
                            opts.onOpenFn.call();
                        }
                        if (opts.dlgClass) {
                            $(dialogId).parents('.ui-dialog').addClass(opts.dlgClass);
                        }
                    }
                })
            );

            if (opts.validate) {
                var extraParValid = {};

                if (opts.callbackOnSuccess) {
                    extraParValid.callback = opts.callbackOnSuccess;
                }

                var options = {
                    success: function(json, statusText, xhr, jqFormObj) {
                        Validate.validateFormData(json, statusText, jqFormObj, extraParValid);
                        Util.hideProgressInd();
                    },
                    beforeSubmit: function(frmData) {
                        Util.showProgressInd();
                    },
                    dataType: 'json'
                };

                $('#' + formName).ajaxForm(options);
            }

            Util.hideProgressInd();
        });
    },

    setUpAjaxFormGeneral: function(formName, cbFunction, beforeSubmitFn) {
        $('#' + formName).livequery(function() {
            /****************************************************/
            var extraPar = {};
            var cpCSRFToken = $('#cpCSRFToken').val();

            if (cbFunction) {
                extraPar.callback = cbFunction;
            }

            var additionalData = {
                cpCSRFToken: cpCSRFToken
            };

            var options = {
                success: function(json, statusText, xhr, jqFormObj) {
                    Validate.validateFormData(json, statusText, jqFormObj, extraPar);
                    Util.hideProgressInd();
                    $('#' + formName).unblock();
                },
                beforeSubmit: function(frmData) {
                    Util.clearPrepopulatedTextbox('#' + formName, frmData);
                    if (beforeSubmitFn) {
                        beforeSubmitFn.call(this, frmData);
                        extraPar.callback = cbFunction;
                    }
                    Util.showProgressInd();
                    $('#' + formName).block({ message: null });
                }
                ,data: additionalData
                ,dataType: 'json'
            };

            $('#' + formName).ajaxForm(options);

        });
    },

    setUpFormWithUploadify: function(formName, exp) {
        $('#' + formName).livequery('submit', function(e) {
            e.preventDefault();

            var formObj = $(this);
            var extraPar = {};

            if (!exp){
                exp = {};
            }

            if (exp.cbFunction) {
                extraPar.callback = exp.cbFunction;
            }

            var formAction = $(this).attr('action');
            Util.showProgressInd();

            // when using block ui, some un-expected errors occured, hence commented out
            // $(formObj).block({ message: null });

            var formContent = $(this).serialize();

            $.post(formAction, formContent, function(json){
                //$(formObj).unblock();
                if ($(formObj).hasClass('cpUploadifyNew') && !exp.cbFunction){
                    extraPar.callback = function(){
                        record_id = json.extraParam.record_id;
                        $('.fileQueueMedia').each(function(){
                            recordType = $(this).attr('id').split('_')[1];
                            $('#uploadifyMedia_' + recordType).uploadifySettings('scriptData', {'id': record_id})
                            $('#uploadifyMedia_'+ recordType).uploadifyUpload();
                        });
                    }
                }

                Util.hideProgressInd();
                Validate.validateFormData(json, '', formObj, extraPar);
            }, 'json');

        });
    },

    prepopulatedTextbox: function(extraParamObj){

        extraParamObj = $.extend({
             boxTextColor: '#999'
            ,boxTextColorFocus: '#444'
        }, extraParamObj || {});

        $("input:text[rel^='pptxt'],textarea[rel^='pptxt']")
        .livequery(function() {
            e = $("input:text[rel^='pptxt'],textarea[rel^='pptxt']");

            for (i=0;i<$(e).length;i++) {
                if ($(e[i]).val()=='') {
                    t = $(e[i]).attr('rel');
                    t = t.split("pptxt:");
                    $(e[i]).css('color', extraParamObj.boxTextColor);
                    $(e[i]).val(t[1]);
                }
            }

            $(e).focus(function() {
                t = $(this).attr('rel');
                t = t.split("pptxt:");
                var value    = $(this).val().replace(/[\r\n]/g, '');
                var pptxtval = t[1].replace(/[\r\n]/g, '');
                if (value == pptxtval) {
                    $(this).css('color', extraParamObj.boxTextColorFocus);
                    $(this).val('');
                }
            });
            $(e).blur(function() {
                t = $(this).attr('rel');
                t = t.split("pptxt:");
                if ($(this).val()=='') {
                    $(this).css('color', extraParamObj.boxTextColor);
                    $(this).val(t[1]);
                }
            });
        });
    },

    clearPrepopulatedTextbox: function(container, frmData) {
        //frmData is an object containing form data

        var len = $("input:text[rel^='pptxt'],textarea[rel^='pptxt']", $(container)).length;
        $("input:text[rel^='pptxt'],textarea[rel^='pptxt']", $(container))
        .each(function(i) {
            var t = $(this).attr('rel');
            var fieldName = $(this).attr('name');
            t = t.split("pptxt:");
            var value    = $(this).val().replace(/[\r\n]/g, '');
            var pptxtval = t[1].replace(/[\r\n]/g, '');
            if (value == pptxtval) {
                $(this).val('');

                if ($.isArray(frmData)){
                    for (var i=0; i < frmData.length; i++) {
                        if (frmData[i].name == fieldName) {
                            frmData[i].value = '';
                        }
                    }
                }
            }
        });
    },

    setJqFormFldValue: function(frmData, name, value){
        $.each(frmData, function(){
            if(this.name == name){
                this.value = value;
            }
        });
    },

    getCKEditorToolBarsFull: function(){
        toolbar =
        [
            ['Bold','Italic','Underline','Strike'],
            ['Cut','Copy','Paste','PasteText','PasteFromWord','-', 'SpellChecker', 'Scayt'],
            ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
            ['Source','-','Preview'],
            '/',
            ['NumberedList','BulletedList', 'Blockquote'],
            ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
            ['Link','Unlink','Anchor'],
            ['Image','Flash','Table','HorizontalRule','SpecialChar'],
            '/',
            ['Format','Font','FontSize'],
            ['TextColor'],
            ['Maximize']
        ];

        return toolbar;
    },

    getCKEditorToolBarsLite: function(){
        toolbar =
        [
            ['Bold','Italic','Underline','Strike']
        ];

        return toolbar;
    },

    showAjaxErrorTemp:  function() {
        Util.alert('There an error while processing the ajax request through the server.' +
                   'Please contact administrator.');
    },

    loadCategoryDropdown: function(){
        $(this).each(function(){
            secId = $(this).val();
            var url = $('#scopeRootAlias').val() + 'index.php?module=webBasic_category&_spAction=categoryJsonBySecId&showHTML=0'

            $.getJSON(url, {section_id: secId}, function(data) {
                $('#frmEdit select#fld_category_id').cp_loadSelect(data);

                if ($('#frmEdit select#fld_sub_category_id').length > 0){
                    Util.loadSubCategoryDropdown();
                }
            });
        });
    },

    loadSubCategoryDropdown: function(){
        $(this).each(function(){
            catId = $('#frmEdit select#fld_category_id').val();
            var url = $('#scopeRootAlias').val() + 'index.php?module=webBasic_subCategory&_spAction=getSubcatJsonByCatId&showHTML=0'

            $.getJSON(url, {category_id: catId}, function(data) {
                $('#frmEdit select#fld_sub_category_id').cp_loadSelect(data);
            });
        });
    },

    loadDropdownByJSON: function(srcFld, srcValue, dstFld, dstRoom){
        var url = $('#scopeRootAlias').val() + 'index.php?room=' + dstRoom + '&_spAction=jsonForDropdown&showHTML=0'

        $.getJSON(url, {srcFld: srcFld, srcValue: srcValue}, function(data) {
            $('#frmEdit select#' + dstFld).cp_loadSelect(data);
        });
    },

    showIE6RejectMessage: function(){
        var jqRejectPath = $('#jssPath').val() + 'jquery/jReject-0.7-Beta/images/'
        $.reject({
             closeCookie: true // Set cookie to remmember close for this session
            ,imagePath: jqRejectPath // Path where images are located
        });
    },

    goToByScroll: function(id){
        $('html,body').animate({scrollTop: $("#"+id).offset().top},'slow');
    },

    getNumberToWord: function(s){
        // American Numbering System
        var th = ['','thousand','million', 'billion','trillion'];
        // uncomment this line for English Number System
        // var th = ['','thousand','million', 'milliard','billion'];
        var dg = ['zero','one','two','three','four', 'five','six','seven','eight','nine']; var tn = ['ten','eleven','twelve','thirteen', 'fourteen','fifteen','sixteen', 'seventeen','eighteen','nineteen']; var tw = ['twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];
        s = s.toString(); s = s.replace(/[\, ]/g,''); if (s != parseFloat(s)) return 'not a number'; var x = s.indexOf('.'); if (x == -1) x = s.length; if (x > 15) return 'too big'; var n = s.split(''); var str = ''; var sk = 0; for (var i=0; i < x; i++) {if ((x-i)%3==2) {if (n[i] == '1') {str += tn[Number(n[i+1])] + ' '; i++; sk=1;} else if (n[i]!=0) {str += tw[n[i]-2] + ' ';sk=1;}} else if (n[i]!=0) {str += dg[n[i]] +' '; if ((x-i)%3==0) str += 'hundred ';sk=1;} if ((x-i)%3==1) {if (sk) str += th[(x-i-1)/3] + ' ';sk=0;}} if (x != s.length) {var y = s.length; str += 'point '; for (var i=x+1; i<y; i++) str += dg[n[i]] +' ';} return str.replace(/\s+/g,' ');
    },

    stringToBoolean: function(string){
        switch(string.toLowerCase()){
            case "true": case "yes": case "1": return true;
            case "false": case "no": case "0": case null: return false;
            default: return Boolean(string);
        }
    }
}

var Actions = {
    addNew: function () {
        $('#frmNew').submit();
    },

    cancelNew: function () {
        msg = "Are you sure you want to cancel?";
        if (confirm (msg)){
            history.back();
        }
    },

    cancelEdit: function () {
        msg = "Are you sure you want to cancel? \n\nYou will lose any changes made";
        if (confirm (msg)){
            history.back();
        }
    },

    edit: function () {
        var url = $(this).attr('url');
        if(url){
            document.location = url;
        }
    },

    save: function (room) {
        $('#frmEdit').submit();
    },

    apply: function (room){
        $('form#frmEdit input[name=apply]').val(1);

        Util.setUpAjaxFormGeneral('frmEdit', function(){
            document.location = document.location;
        });
        $('#frmEdit').submit();
    },

    saveList: function (task) {
        frmObj = document.forms['list'];

        if (frmObj.boxChecked.value == 0){
            alert("Please tag the record(s) before you proceed");
            return;
        }

        if ( task == "delete" ){
            var msg = "Are you sure to delete the selected record(s)? \n\nYou cannot undo this";
            if ( !confirm (msg)){
                return;
            }
        }

        frmObj.task.value = task;
        frmObj.submit();
    },

    changePassword: function () {
        var url = $(this).attr('url');
        if(url){
    		var title = $(this).attr('title');
            Util.openFormInDialog.call(this, 'changePasswordForm', title, 650, 350);
        }
    },

    checkAll: function (n, fldName) {
        if (!fldName) {
            fldName = 'cb';
        }
        var f = document.list;
        var c = f.toggle.checked;
        var n2 = 0;

        for (i=0; i < n; i++) {
            cb = eval( 'f.' + fldName + '' + i );
            if (cb) {
                cb.checked = c;
                n2++;
            }

            if ( i%2 == 0){
                Actions.highlightRow(cb, cb.value, 'odd');
            } else {
                Actions.highlightRow(cb, cb.value, 'even');
            }

        }

        if (c) {
            document.list.boxChecked.value = n2;
        } else {
            document.list.boxChecked.value = 0;
        }
    },

    highlightRow: function (checkboxObj, rowID, rowClassName) {
        var rowID = "listRow__" + rowID;
        if (checkboxObj.checked){
            document.getElementById(rowID).className ="highlight";
        } else {
            document.getElementById(rowID).className = rowClassName;
        }
    },

    printListScreen: function (url){
        w = 800;
        h = 600;
        windowString = "height=" + h + ",width=" + w + ",scrollbars=yes," +
        "resizable=yes,left=" + (screen.width-w)/2 + ",top=" +
        (screen.height-h)/2

        wind = window.open( url , "printData", windowString);
    },

    printListPDF: function (queryString){
        var room = $('#cpRoom').val();

        var roomNameArr = room.split("_");
        var reportName  = roomNameArr[1];

        var reportName = reportName + 'List';
        var url = 'index.php?_spAction=printReport&showHTML=0&roomName=' + room + '&report=' + reportName +
        '&' + queryString;
        document.location = url;
    },

    printListPDFPHPExcel: function (queryString){
        var room = $('#cpRoom').val();
        var reportName = room + 'List';
        var url = 'index.php?_spAction=printReport&showHTML=0&roomName=' + room + '&report=' + reportName +
        '&' + queryString;
        document.location = url;
    },

    printDetailPDF: function (){
        var room = $('#cpRoom').val();
        var record_id = $('#record_id').val();
        var url = 'index.php?_spAction=printReport&showHTML=0&roomName=' + room
                  + '&report=' + room
                  + '&record_id=' + record_id
        document.location = url;
    },

    importData: function (room_name, importType) {
        w = 700;
        h = 600;
        windowString = "height=" + h + ",width=" + w + ",scrollbars=yes," +
        "resizable=yes,left=" + (screen.width-w)/2 + ",top=" +
        (screen.height-h)/2
        wind = window.open( "index.php?_spAction=importData&room_name=" + room_name + '&importType=' + importType, "importContact", windowString);
    },

    deleteRecord: function(room){
        var rowID= $('#record_id').val();
        var cpCSRFToken = $('#cpCSRFToken').val();
        msg = "Are you sure you want to delete this record?\nYou cannot undo this action!";

        Util.confirm(msg, function(){
            var url = "index.php?_spAction=deleteRecordByID&showHTML=0" ;

            var data = {
                 record_id: rowID
                ,room: room
                ,cpCSRFToken: cpCSRFToken
            };
            $.post(url, data, function(json){
                if(json.status == 'success'){
                    var url = $('#returnToListUrl').val();
                    document.location = url;
                } else {
                    Util.alert(json.message);
                    if(json.refresh){
                        document.location = document.location;
                    }
                }
            }, 'json')

        }, {title: 'Delete Record'}
        );
    },

    duplicateRecord: function (topRoom, room){
        var rowID = $('#record_id').val();
        var msg = "Are you sure you want to duplicate this record?";

        Util.confirm(msg, function(){
            var url = "index.php?_spAction=duplicateRecordByID&showHTML=0";

            var data = {
                 record_id: rowID
                ,room: room
                ,topRoom: topRoom
            };

            $.post(url, data, function(json){
                if(json.status == 'success'){
                    document.location = json.returnUrl;
                } else {
                    Util.alert(json.message);
                }
            }, 'json')

        }, {title: 'Delete Record'}
        );
    },

    printDetailMenu: function (url){
        url += '&_action=detail&_spAction=reportsMenu&showHTML=0';

        var rowID= $('#record_id').val();
        url = url + "&record_id=" + rowID;
        Util.showProgressInd();

        $.get(url, function(data){
            Util.initDialog();
            $('#dialog').html(data);

            var x_dialog = $('#dialog').dialog(
                $.extend(Util.dialogDefaults, {
                    width: 450,
                    height: 230,
                    title: 'Print Menu'
                })
                );
            Util.hideProgressInd();
        });

    },

    openReportsMenu: function(url){
        url += '&_spAction=reportsMenu&showHTML=0';

        var record_id = $('#record_id').val();
        if (record_id){
            url += '&record_id=' + record_id;
        }

        Util.showProgressInd();

        $.get(url, function(data){
            Util.initDialog();
            $('#dialog').html(data);

            var x_dialog = $('#dialog').dialog(
                $.extend(Util.dialogDefaults, {
                    width: 450,
                    height: 230,
                    title: 'Reports Menu'
                })
                );
            Util.hideProgressInd();
        });
    },

    isChecked: function(isItChecked){
        if (isItChecked == true){
            document.list.boxChecked.value++;
        } else {
            document.list.boxChecked.value--;
        }
    }
}



//=====================================================//
var Validate = {

    validateFormData: function(json, statusText, jqFormObj, extraParamObj){
        if (typeof(json) == 'string') {
            eval('var json =' + json);
        }
        var callbackFunction = null;
        var callbackFunctionOnError = null;
        if (extraParamObj) {
            if (extraParamObj.callback) {
                callbackFunction = extraParamObj.callback;
            }

            if (extraParamObj.callbackOnError) {
                callbackFunctionOnError = extraParamObj.callbackOnError;
            }
        }

        $(jqFormObj).find('.progressSpan').removeClass('progress').css('display', 'none');

        var errorCount = json.errorCount;
        if(errorCount == 0){
           var successHandler = jqFormObj.attr("success");
            if (successHandler) {
                eval(successHandler);
            }

            var successMsgFld = $('input[name=successMsg]', jqFormObj);
            var dialogMsgFld  = $('input[name=dialogMessage]', jqFormObj);

            if ($(successMsgFld).length > 0){
                var formHt = $(jqFormObj).height();
                $(jqFormObj).css('height', formHt + 'px');
                $(jqFormObj).html($(successMsgFld).val());
                $('html,body').animate({scrollTop: $('body').offset().top},'slow');
            } else if ($(dialogMsgFld).length > 0){
                Util.closeAllDialogs();
                Util.alert($(dialogMsgFld).val());
            } else {
                returnUrl = json.returnUrl;
                if (returnUrl) {
                    document.location = returnUrl;
                } else {
                    var returnUrl = $(jqFormObj).find('[name=returnUrl]').val();
                    if (returnUrl) {
                        document.location = returnUrl;
                    } else if(callbackFunction) {
                        callbackFunction.call(this, json, statusText, jqFormObj, extraParamObj);
                    }
                }

            }
        } else {

            if(json.hasCSRFTokenError == 1){//CSRF Token Mismatch
                Util.showProgressInd();
                document.location = document.location;
                return;
            }

            var htmlText  = "";
            htmlText += "<h4>The following errors occured</h4>";

            $(jqFormObj).find('div').removeClass('error');
            $(jqFormObj).find('div strong[class=message]').remove();

            var tmpCount = 0;
            $.each(json.errors, function() {
                fieldName = this.name;
                var fieldObj  = $('#fld_' + fieldName,  jqFormObj);

                var parent = "";

                if (fieldObj.length > 0){
                    parent = fieldObj.parent('div');
                } else if (fieldObj.attr('type') == 'radio') {
                    // since each radio is encapsulated in each div we would simply
                    // add the error class to the parent - two level up
                    parent = fieldObj.parent('div').parent('div');

                } else {
                    /*** radio ***/
                    fieldObj = $('#' + fieldName + '_1',  jqFormObj);
                    if (fieldObj.length > 0){
                        var wrapper = $(fieldObj).closest('.form-row-wrapper');
                        if (wrapper.length > 0){
                            parent = wrapper;
                        } else {
                            parent = fieldObj.parent('div').parent('div');
                        }
                    }
                }

                if(parent != ""){
                    parent.addClass('error');

                    if (tmpCount == 0){
                        $('html,body').animate({scrollTop: $(parent).offset().top},'slow');
                    }
                }

                if (this.msg) {
                    htmlText  += '<p>' + this.msg + '</p>';

                    if(parent != ''){
                        parent.prepend("<strong class='message'>" + this.msg + "</strong>");
                    }

                    if ($(jqFormObj).hasClass('columnar')){
                        lblWidth = $('label', parent).css('width');
                        $('strong[class=message]', parent).css('margin-left', lblWidth);
                    }
                }

                $("#label_" + fieldName).addClass("formFieldLabelError");

                tmpCount++
            });

            /*
            $(jqFormObj).find("#errorDisplayBox").html(htmlText);
            $(jqFormObj).find("#errorDisplayBox").addClass('errorDisplayBox');
            $(jqFormObj).find("#errorDisplayBox").css('display', 'block');
            */

            if(callbackFunctionOnError) {
                callbackFunctionOnError.call(this, json, statusText, jqFormObj, extraParamObj);
                return;
            }

            var customErrorField = $('.customErrorBox', jqFormObj);
            if ($(customErrorField).length > 0){
                $(jqFormObj).find(".customErrorBox").css('display', 'block');
            }

            if ($('#captcha').length > 0){
                $('#reloadCaptcha').click();
            }
        }
    }
}


//------------------------------------------------//
var Lang = {
    get: function(key, defaultVal) {
        defaultVal = (defaultVal) ? defaultVal : key;
        var data = (Lang.data[key]) ? Lang.data[key] : defaultVal;
        return data;
    }
}

//------------------------------------------------//
var Cfg = {
    get: function(key) {
        return Cfg.data[key];
    }
}

var Links = {
    showEditLinkDialog: function(e) {
        e.preventDefault();
        var linkName      = $(this).closest('.linkPortalWrapper').attr('id');
        var lnkRoomActual = $(this).closest('.linkPortalWrapper').attr('lnkRoomActual');
        var validationJsMethod = $(this).attr('validationJsMethod');

        extraPar= {
            beforeCloseFn: function(){
                Links.reloadPortalRecords(linkName, lnkRoomActual);
            },
            validationJsMethod: validationJsMethod
        }

        Util.openDialogForLink.call(this, 'Edit Link',  $(window).width()-100, $(window).height()-30, 1, extraPar);
    },

    showNewEditPortalForm: function(e) {
        var title = $(this).attr('dialogTitle');
        var linkName      = $(this).closest('.linkPortalWrapper').attr('id');
        var lnkRoomActual = $(this).closest('.linkPortalWrapper').attr('lnkRoomActual');


        var portalWidth  = parseInt( $(this).attr('w') );
        var portalHeight = parseInt( $(this).attr('h') );


        e.preventDefault();
        var expObj = {
            validate: true,
            callbackOnSuccess: function(){
                Util.closeAllDialogs();
                Links.reloadPortalRecords(linkName, lnkRoomActual);
            }
        }
        Util.openFormInDialog.call(this, 'portalForm', title, portalWidth, portalHeight, expObj);
    },

    showDetailPortalForm: function(e) {
        var title = $(this).attr('dialogTitle');
        var portalWidth  = parseInt( $(this).attr('w') );
        var portalHeight = parseInt( $(this).attr('h') );

        e.preventDefault();
        var expObj = {
            buttons: {'Close': function() {
                                   $('#dialog').dialog('destroy');
                               }
            }
        }
        Util.openFormInDialog.call(this, 'portalForm', title, portalWidth, portalHeight, expObj);
    },

    deletePortalRecord: function(e) {
        e.preventDefault();

        var linkName = $(this).closest('.linkPortalWrapper').attr('id');
        var lnkRoomActual = $(this).closest('.linkPortalWrapper').attr('lnkRoomActual');
        var srcRoomId = $(this).attr('srcRoomId');

        var url = $(this).attr('link');

        msg = "Are you sure you want to delete this record?\nYou cannot undo this action!";

        Util.confirm(msg, function(){
            $.getJSON(url, function(json){
                if(json.status == 'success'){
                    Links.reloadPortalRecords(linkName, lnkRoomActual, srcRoomId, 'edit');
                } else {
                    Util.alert(json.message);
                }
            })
//            $.get(url, function(){
//                Links.reloadPortalRecords(linkName, lnkRoomActual, srcRoomId, 'edit');
//            });
        }, {'title': 'Delete Record'});
    },

    addToLinked: function(e) {
        Util.showProgressInd();
        var link = $(this).attr('link');

        $.get(link, function(){
            Links.reloadLinkWindow();
        });
    },

    removeFromLinked: function(e) {
        Util.showProgressInd();
        var link = $(this).attr('link');

        $.get(link, function(){
            Links.reloadLinkWindow();
        });
    },

    addRemoveAll: function(e) {
        Util.showProgressInd();
        var link = $(this).attr('link');

        var wrapper = $(this).closest('.linkWrapper');
        var rows = $('table tbody tr', wrapper);
        var ids = [];
        $.each(rows, function(i){
            ids[i] = $(this).attr('recId');
        });
        $.post(link, {'ids[]': ids}, function(data){
            Links.reloadLinkWindow();
        });
    },

    reloadLinkWindow: function(e) {
        var url1 = $('#url_notLinked').val();
        var url2 = $('#url_linked').val();

        $.get(url1, function(data){
            $('#linkLeft').hide();
            $('#linkLeft').html(data);
            $('#linkLeft').slideDown('3000');

            $.get(url2, function(data){
                $('#linkRight').hide();
                $('#linkRight').html(data);
                $('#linkRight').slideDown('3000');
                Util.hideProgressInd();
            });
        });
    },

    setSingleValue: function() {
        var id = $(this).attr('recId');
        var fldName = $('#linkSingleFldId').val();
        $('#' + fldName).val(id);
        $('#' + fldName).trigger('change');

        // fix for selectmenu to re-build the selectmenu with the new value
        //$('#' + fldName).selectmenu();
        $('#dialog').dialog('close');
        $('#dialog').dialog('destroy');
    },

    searchNotLinked: function() {
        var form = $(this);

        var options = {
            success: function(data) {
                $('#linkLeft').hide();
                $('#linkLeft').html(data);
                $('#linkLeft').slideDown('3000');
                Util.hideProgressInd();
            },
            beforeSubmit: function() {
                Util.showProgressInd();
            }
        };

        $(form).ajaxForm(options);

        $('select', form).change(function(){
            form.submit();
        });
    },

    searchLinked: function() {
        var form = $(this);

        var options = {
            success: function(data) {
                $('#linkRight').hide();
                $('#linkRight').html(data);
                $('#linkRight').slideDown('3000');

                Util.hideProgressInd();
            },
            beforeSubmit: function() {
                Util.showProgressInd();
            }
        };

        $(form).ajaxForm(options);

        $('select', form).change(function(){
            form.submit();
        });
    },

    loadDataFromUrl: function(e) {
        Util.showProgressInd();
        var link = $(this).attr('link');
        var wrapper = $(this).closest('.linkWrapper');
        $.get(link, function(data){
            $(wrapper).html(data);
            Util.hideProgressInd();
        });
    },

    filterLinkPortalRecords: function(linkName){
        linkName2 = linkName.replace('#', '__')
        portalDiv = $('.' + linkName2);

        var record_id  = $('#record_id').val();
        var formContent = $('form', portalDiv).serialize();
        formContent += '&linkName=' + linkName + '&record_id=' + record_id;

        var scopeRootAlias = $('#scopeRootAlias').val();
        var url = scopeRootAlias + "index.php?_spAction=linkPortalRecordsByFilter" + "&showHTML=0";

        $.post(url, formContent, function(data){
            $('table', portalDiv).remove();
            $(portalDiv).append(data);
        });
    },

    reloadPortalRecords: function(linkName, lnkRoomActual, recId, action){
        linkName2 = linkName.replace('#', '__')
        portalDiv = $('.' + linkName2);

        var linkArr = linkName.split("#");
        var srcRoom = linkArr[0];
        var lnkRoom = linkArr[1];

        lnkRoomActual = lnkRoomActual == undefined ? srcRoom : lnkRoomActual;

        var record_id = '';
        if (recId){
            record_id = recId;
        } else  if (portalDiv.closest('.childWrapper').length > 0){
            record_id = portalDiv.closest('.childWrapper').attr('parent_id');
        } else {
            record_id = $('#record_id').val();
        }

        if (!action){
            action = $('#cpAction').val();
        }

        var formContent = $('form', portalDiv).serialize();

        var lnkRoomActualText = lnkRoomActual != '' ? '&lnkRoomActual1=' + lnkRoomActual : '';
        formContent += '&record_id=' + record_id
                     + '&_action=' + action
                     + '&srcRoom=' + srcRoom
                     + '&lnkRoom=' + lnkRoom
                     + lnkRoomActualText

        var scopeRootAlias = $('#scopeRootAlias').val();
        var url = scopeRootAlias + "index.php?_spAction=linkPortalRecordsByFilter" + "&showHTML=0";

        $.post(url, formContent, function(data){
            //alert($('.linkPortalDataWrapper', $('.broadcast__testRecipient')).length);

            $('.linkPortalDataWrapper', portalDiv).hide();
            $('.linkPortalDataWrapper', portalDiv).html(data);
            $('.linkPortalDataWrapper', portalDiv).slideDown('slow');
        });
    },

    addNewGridRecord: function(e) {
        e.preventDefault();
        var linkName      = $(this).closest('.linkPortalWrapper').attr('id');
        var lnkRoomActual = $(this).closest('.linkPortalWrapper').attr('lnkRoomActual');

        var url = $(this).attr('link');
        var recId = $(this).attr('recId');

        $.post(url, function(data){
            Links.reloadPortalRecords(linkName, lnkRoomActual, recId, 'edit');
        });
    },

    updateGridData: function(){
        var tbl = $(this).closest('table.grid');
        var tr  = $(this).closest('tr');
        var frmObj  = $(this).closest('form');
        var saveUrl = tbl.attr('saveUrl');
        var keyFld  = tbl.attr('keyFld');
        var id  = tr.attr('recId');
        var url = saveUrl + '&' + keyFld + '=' + id;

        //var row={};
        //$(tr).find('input,select,textarea').each(function(){
        //    row[$(this).attr('name')]=$(this).val();
        //});

        row = $(tr).serializeAnything()+ '&' + keyFld + '=' + id;;

        $.post(url, row, function(data){
        });
    }
}

