/*****
 * $Id$ app.js
 *
 *
 * Application javascript controls.
 * @requires jQuery Library.
 * @author Nattakorn Samnuan
 * @email nattakorn@icesolution.com
 */

 var app = null;

 app = {
 	version:"1.08rc3",
 	name : projectName,
 	basePath : 'http://'+window.location.hostname+"/"+projectName,
 	popupId : [],

 	check: function() {
	    if((typeof window.jQuery == "undefined")) throw("script app.js requires the jQuery JavaScript framework.");
	},

	imports: function(libfile) {
 	    /**
 	     * Call after included Core library
 	     */
 		$("head").append("<script language=\"javascript\" type=\"text/javascript\" src=\""+libfile+"\"></script>");
 	},

    getScript:function(script){ if(!script) return; $.getScript(script); },

 	gotohome: function () { window.location = "/"+app.name+"/portal/home/display"; },

	gotoview: function (view,params) {
         var p = [];
         var _htreg = /^http\:\/\/*/i;
         var _hostname = window.location.hostname;
         if(params && typeof params == "object") for(var i in params) { p.push(i+"/"+params[i]);}
         var url = (_htreg.test(view))?
                   view.replace('http://'+_hostname,'')+"/"+p.join("/"):
                   "/"+projectName+"/"+view+"/"+p.join("/");
         // Redirec to URL.
         if(url.substr(-1) == "/") url = url.substring(0,url.length-1);
         window.location = url.replace("//","/");
    },

    changeLang: function(lang){
        $.ajax({
          type: "POST",
          dataType : "json",
          url: "/"+app.basePath+"/default/index/set-language",
          data: '_lang='+lang,
          success: function(returnData){
            if(returnData && (typeof returnData.exec == "function" && returnData.exec.constructor == Function)) {
                returnData.exec();
            }
          }
        });

    },

    /**
     * Default Option
     *
     * The table shows the features and the string tokens you can use:
     *   status      The status bar at the bottom of the window.
     *   toolbar     The standard browser toolbar, with buttons such as Back and Forward.
     *   location    The Location entry field where you enter the URL.
     *   menubar     The menu bar of the window
     *   directories The standard browser directory buttons, such as What's New and What's Cool
     *   resizable   Allow/Disallow the user to resize the window.
     *   scrollbars  Enable the scrollbars if the document is bigger than the window
     *   height      Specifies the height of the window in pixels. (example: height='350')
     *   width       Specifies the width of the window in pixels.
     */
    open: function (view,name,options) {
        if(typeof options == "object" && options.constructor == Object) {
            options = $.extend({'status':1,'toolbar':0,'location':0,'menubar':0,'directories':0,'resizable':1,'scrollbars':1,'width':800,'height':600,'left': (screen.width) ? (screen.width-options.width)/2 : 0,'top' : (screen.height) ? (screen.height-options.height)/2 : 0},options);
            // Require JSON Library (json.js)
            options = JSON.toString(options).replace(/\(|\{|\}|\)|\"|\'/ig,"").replace(/\:/ig,"=");
        }
        var url = ('/'+this.name+'/'+view).replace("//","/");
        if(!name) {
            var dd = new Date();
            name = 'new-popup-'+dd.getTime();
        }
        var _popupId = window.open(url,name,'"'+options+'"');
        options = null;
        return _popupId;
    },

    showMsg:function(msg,prt,options) {
        $('<div id="error_msg" class="alert-msg" align="left">'+msg+'</div>').appendTo("body");
        var _cont = prt?$("#"+prt):$("body");
        var _lmsg = $("div.alert-msg");
        var params = _cont.position();

        params.left   = (params.left/1.3)+((_cont.width()-_lmsg.width())/2);
        params.top    = (params.top/1.4)+((_cont.height()-_lmsg.height())/2);
        options.width = options.width?options.width:400;
        options.delay = options.delay?options.delay:3000;

        _lmsg.css(params);
        params.width = options.width;
        $("#error_msg").css(params).fadeIn('slow').animate({opacity: 0.7}, options.delay).fadeOut('slow', function() { $(this).remove(); });
    },
/*
    _setPopupId : function(id) {
        this.popupId[id] = id;
    },
*/
    openPopup : function(params) {

        app.ajax.init(params.id);
        $('#'+params.id+"-popup").dialog("open");
        var _id = params.id;
        var _url = params.url;

        $('#'+_id+"-popup").html("<center><b>Loadding...</b></center>");

        setTimeout(function(){
            var html = app.ajax.html(_url);
            $('#'+_id+"-popup").empty().html(html);
            app.ajax.initScript(_id);
        },1000);
        params=null;
        return;
    },

    closePopup : function(id) {
        var popup_id = $("#"+id+"_container").parent().attr("id");
        if(popup_id) {
            if($('#'+popup_id).dialog) {
                $('#'+popup_id).dialog("close");
            } else {
                if(window.opener) {
                    window.close();
                }
            }
        }
        return;
    }
 }

 app.ajax = null;
 app.ajax = {
    updating:new Date(),

    init:function(elm, options) {
        var _prt = false;
        if(typeof elm == "object") _prt = $(elm);
        else _prt = $("#"+elm+"_listcontainer").size()?$("#"+elm+"_listcontainer"):$("#"+elm);

        if(!_prt.size()) return;

        if(_prt.is("tbody")) { _prt = $(_prt.parents("table").get(0)); }
        if(!options) options = {};
        options = $.extend({dataType :'html',global: true,type: "POST",mode: 'queue'},options); //,async:false// processData: false

        $.ajaxSetup(options);

        var _overlay = $('<div id="loadding-overlay"></div>').appendTo('body');
        var _lmsg = $('div[@id^=loadding-msg]');
        if(!_lmsg.size() > 0) {
            var msgObj = '<div id="loadding-msg" class="loadding-msg x-air-window" style="width: 105px;">' +
                         '<table cellpadding="0" cellspacing="0" border="0" class="x-air" width="100%">' +
                         '<tr><td class="x-air x-window-tl"></td><td class="x-air x-window-tc" width="100%"></td>' +
                         '<td class="x-air x-window-tr"></td></tr>' +
                         '<tr><td class="x-air x-window-ml"></td><td class="x-air x-window-mc"><div class="x-air x-window-body">' +
                         '<div class="x-air x-window-wait"><img src="/'+app.name+
            		     '/modules/systemapi/templates/default/images/shared/loading/wait.gif"/></div>' +
                         '<div class="x-air x-window-body-text">Loading...</div></div>' +
                         '</td><td class="x-air x-window-mr"></td></tr>' +
                         '<tr class="x-air x-window-bc"><td class="x-air x-window-bl"></td><td class="x-air x-window-footer"></td>' +
                         '<td class="x-air x-window-br"></td></tr>' +
                         '</table></div>';

            _lmsg = $(msgObj).animate({opacity: 0.9}).appendTo('body')
            /*
            .ajaxStart(function(){
                $('div#loadding-overlay').show();
                $(this).show();
            })
            */
            .ajaxStop(function(){
            //.ajaxComplete(function(){
                $(this).fadeOut('fast');// , function() {$(this).remove();}
                $('div[@id^=loadding-overlay]').fadeOut('fast', function() {$(this).remove(); });
            });
            msgObj = null;
        }

        var params = _prt.offset();
        _overlay.css($.extend({},params,{'width':_prt.width(),'height':_prt.height(),'opacity': 0.3})).show();

        params.left = params.left+((_prt.width()-_lmsg.width())/2);
        params.top  = params.top+((_prt.height()-_lmsg.height())/2)-20;

        _lmsg.css(params).show();
        return;
    },

    parseParameter: function(params) {
        /*
        var p = new Array();
        if(params && typeof params == "object") {
            for(var i in params) {
                if(typeof params[i] != "object") {
                    // var _p = app.ajax.parseParameterArr(params[i]);
                    //p.push(i+"="+_p);
                    p.push(i+"="+params[i]);
                }
            } // if(params[i])
            return p.join("&");
        } else return params;
        */
        return app.ajax.ued_encode(params);
    },

    // ued_encode() will take an array as its argument and return the data encoded in UED format - as a string.
    // From http://www.openjs.com/scripts/data/ued_url_encoded_data/
    ued_encode : function (arr,current_index) {
    	var query = ""
    	if(typeof current_index=='undefined') current_index = '';

    	if(typeof(arr) == 'object') {
    		var params = new Array();
    		for(key in arr) {
    			var data = arr[key];
    			var key_value = key;
    			if(current_index) {
    				key_value = current_index+"["+key+"]"
    			}

    			if(typeof(data) == 'object') {
    				if(data.length) { //List
    					for(var i=0;i<data.length; i++) {
    						params.push(key_value+"[]="+app.ajax.ued_encode(data[i],key_value)); //:RECURSION:
    					}
    				} else { //Associative array
    					params.push(app.ajax.ued_encode(data,key_value)); //:RECURSION:
    				}
    			} else { //String or Number
    				params.push(key_value+"="+encodeURIComponent(data));
    			}
    		}
    		query = params.join("&");
    	} else {
    		query = arr;//encodeURIComponent(arr);
    	}

    	return query;
    },

    parseFormData: function(form) {
        if(form && typeof form == "string") form = $("#"+form);
        // var data = "";
        return form.find(":input").serialize();
        /*
        form.children("input").each(function(i,n){
            data.push(n.name+"="+n.value);
        });
        */
        // return (data)?data.join("&"):null;
    },

    html: function(url,params) {
        var html = $.ajax({
            dataType :'html',
            url: (url+"/_t/"+this.updating.getTime()).replace("//","/"),
            data: "rpc=1"+((params)?"&"+this.parseParameter(params):""),
            async: false
        }).responseText;
        params=null;
        return html;
    },

    update: function(update_id, url, params, callback) {
        this.init(update_id);
        var localScrip = [];
        $("script[src$=\.js]").each(function(){ localScrip.push(this.src); });
        $.ajax({
            dataType :'html',
   	        url: (url+"/_t/"+this.updating.getTime()).replace("//","/"),
            data: "rpc=1"+((params)?"&"+this.parseParameter(params):""),
       	    success: callback || function(returnText) {
       	        // returnText = $.trim(returnText.replace(/\r\n|\n|\t/ig,""));
       	        // alert(returnText);return;
       	        var html;
       	        /*if(jQuery.browser.mozilla) {
                    html = new Array();
           	        $(returnText).each(function(i,n){
           	            if($(this).is('script[src$=\.js]')){
                            if($.inArray(this.src, localScrip) == -1) html.push(this);
           	            } else {
                            html.push(this);
           	            }
           	        });

           	        returnText = null;
           	        localScrip = null;
           	    } else {*/
                    html = returnText;
                    returnText = null;
       	        /*}*/

       	        if(typeof update_id == "string") {
       	            $("#"+update_id).empty().html(html);
       	            app.ajax.clearBlankTag($("#"+update_id));
                } else if(typeof update_id == "object" && update_id.size() > 0) {
                    update_id.empty().html(html);
                    app.ajax.clearBlankTag(update_id);
                } else {
                    $(update_id).empty().html(html);
                    app.ajax.clearBlankTag($(update_id));
                }
                html = null;
       	        app.ajax.initScript(update_id);
       	    },

       	    error : function (returnText) {
       	        _alert(returnText,"System Error !");
       	    }
   	    });

   	    params = null;
   	    return;
    },

    clearBlankTag : function(elm) {
        $(elm.parents('table').get(0)).children('tbody').each(function(){
           if($(this).children().size()==0) { $(this).remove();};
        });
        return;
    },

    call: function(url, params, callback) {
        $.ajax({
    	    url: (url+"/_t/"+this.updating.getTime()).replace("//","/"),
            data: "rpc=1&"+this.parseParameter(params),
            success: callback
    	});
    	params=callback=null;
    	return;
    },

    submit: function(form, url, params, callback) {
    	form =(typeof form != "object")?$("#"+form):$(form);

        this.init($(form.find("table").get(0)));

        var dataForm = this.parseFormData(form);
        $.ajax({
            url: (url+"/_t/"+this.updating.getTime()).replace("//","/"),
            data: "rpc=1&"+(dataForm?dataForm:"")+(params?"&"+this.parseParameter(params):""),
            success: callback
        });
        params=null;
        return;
    },

    parseJson : function(textReturn) {
        var _val = {};
        try {
            eval("_val="+textReturn+";");
        } catch (e) {
            alert("Error :\n"+textReturn+"\nMSG:"+e.message);
            return false;
        }
        textReturn=null;
        return _val;
    },

    _callback: function(textReturn) {
        var params = app.ajax.parseJson(textReturn);
        if(typeof params == "object" && params.exec) {params.exec();}
        else alert(params.toString());
        params = null;
        textReturn=null;
        return;
    },

    initScript : function(id) {

        this.toggleEditor();
        initBtn(id);

        if($("script.init-script").size() > 0)
            $("script.init-script").each(function () { eval( $(this).html() ); });

        if(id) {
            if(typeof id == "object" && id.size()>0) id = id.get(0).id;

            if($.browser.msie) {
                $("#"+id +" :checkbox, #"+id +" :radio").css("border",0);
                $("#"+id +" input.btn_tools").each(function(){
                    if(this.value) this.value = "   "+this.value;
                });
            }
        }
        return;
    },

    toggleEditor: function () {
        if(typeof tinyMCE != "object") return;
    	$("form textarea").each(function() {
    	    if($(this).attr('editor') != '0') {
	    	    var id = this.id;
	    	    if (tinyMCE.getInstanceById(id) == null) tinyMCE.execCommand('mceAddControl', false, id);
	        	else tinyMCE.execCommand('mceRemoveControl', false, id);
        	}
    	});
    	return;
    }
 }

 app.list = null;
 app.list = {

    search : function(name,base_url,params) {

        var _val = $("#"+name+"_toolsbar").find("input[@type=text]").val();
        _container = $("#"+name+"_container");
        // params._sort = '';
        if(!params) params = {};
        $.extend(params,{'_k':_val?_val:''});
        return app.ajax.update(_container,base_url, params);
    },

    setList : function(returnText) {
    	var data = app.ajax.parseJson(returnText);

    },

    enter : function(e) {
        if (e.keyCode==13) { $("#btn_search").click(); };
        return false;
    },

    /**
     * @param params.mode Form new or edit mode.
     *
     */
    action : function(params) {
        if(!params) params = {};
        var _url = "";
        var _start = params.start?params.start:$('#pagination-'+params.name+'-container').attr('start');
        _start = _start?_start:1;
    	switch (params.mode) {
    	    case "new":
    	        app.ajax.update(params.name+"_container",params.url.replace("//","/"), {'_m':params.mode,'start':_start}); /* ,id:params.id */
    			break;
            case "edit":
    		case "view":
    		    _url = params.url.split("/");
                _url[4] = "form";
                _url = _url.join("/");
                var _params = {
                    '_m'    : params.mode,
                    'start' : _start,
                    'id'    : params.id,
                    'id2'   : (typeof params.id2 != "undefined"?params.id2:''),
                    'id3'   : (typeof params.id3 != "undefined"?params.id3:'')
                };
    			app.ajax.update(params.name+"_container",_url.replace("//","/"),_params);
    			_params = null;
    			break;
    		case "delete":
    		    var id = this.getCheckboxVal();
    		    if(!id) {
    		    	if($("#lbl_no_select").val()){
    		    		var no_select = $("#lbl_no_select").val();
    		    	}else{
    		    		var no_select = "Please select row to delete !";
    		    	}
    		        _alert(no_select,"Warnning !");
    		        return;
    		    }

    		    var _params = params;
    		    var _callback = function() {
    		        var p = {
    		            '_m'    : _params.mode,
    		            'start' : _start,
    		            'id'    : id
    		        }

    		        var url = _params.url.replace("//","/");

    		        app.ajax.init(_params.name);
    		        app.ajax.call(url, p, app.ajax._callback);
    		        _params = null;
    		        return;
    			};
    				if($("#lbl_confirm_del").val()){
    		    		var confirm_del = $("#lbl_confirm_del").val();
    		    	}else{
    		    		var confirm_del = "Are you sure to delete selected record ?";
    		    	}

    		    _confirm(confirm_del, _callback);
    		    _callback = null;
    			break;
    		default:
    		    window.location = params.url;
    			break;
    	}

    	params=null;
    	return;
    },

    reload : function (name,base_url,params) {
        if(!params) params = {};
        var _start = params.start?params.start:$('#pagination-'+name+'-container').attr('start');
        $.extend(params,{'start':_start?_start:1});
        $("#"+name+"_toolsbar").find("input[@type=text]").val("");
        app.ajax.update(name+"_container",base_url,params);
        base_url=null;
        return;
    },

    select : function(params) {
        $("input[@id="+params.child+"]").each(function(){this.checked = params._this.checked;});
        params=null;
        return;
    },

    popupSelect : function(params) {
        var popup_id = $("#"+params.name+"_container").parent().attr("id");
        var _id = popup_id.replace("-popup","");
        $("#"+_id).val(params.id);
        app.closePopup(params.name);
        params=popup_id=_id=null;
        return;
    },

    checkselect: function(params) {
        var num_check = 0;
        var _parent = $(params._this).parents("table.tbl").get(0);
        $("input[@id="+params.child+"]",_parent).each(function(){ num_check+=this.checked?1:0;});
        if(num_check>0 && $("#"+params.prt,_parent)[0].checked==false) $("#"+params.prt,_parent)[0].checked = true;
        else if(num_check<=0 && $("#"+params.prt,_parent)[0].checked==true) $("#"+params.prt,_parent)[0].checked = false;
        params=null;
        return;
    },

    getCheckboxVal : function() {
        var val = [];
        $("input[@name=checkrows]").each(function(){ if(this.checked) val.push(this.value); });
        return val.join(",");
    },

    openForm : function() {
    	// TODO
    },

    go:function(name,url,params) {
        // TODO : go Action
        if(name){
            var _name = "";
            _name = name;

            if($("#"+_name+"_form").size() == 0) return;

            var action = $("#"+_name+"_form").attr("action");

            var _tbody = $($("td.sortable").parents("table").get(0)).find("tbody#"+_name+"_tbody");
            //var criteria = $("dfn", $("td.sortable").get(0)).text()+ "_" + (jQuery.className.has( $("td.sortable").get(0), "sortup" ) ? "ASC" : "DESC" );

            if(_tbody.size()>0) {
                var _keyword = $("#"+_name+"_toolsbar").find("input[@type=text]").val();
                params = $.extend({
                    '_sort': params["_sort"]?params["_sort"]:"",
                    '_k': _keyword?_keyword:""
                }, params);

                if($("#"+_name+"_form").size()) {
                    params = jQuery.extend(params, $("#"+_name+"_form").dataFormToObject());
                    // params["_data"] = $("#"+_name+"_form").serialize();
                }
                app.ajax.update(_tbody, url, params);
            }
        }
    }
 }

 app.form = null;
 app.form = {

    action : function(params) {
        var _start = params.start?params.start:$('#pagination-'+params.name+'-container').attr('start');
        $.extend(params,{'start':_start?_start:1});

    	if(params.mode == "cancel") {
    	    app.ajax.toggleEditor();
            app.ajax.update(params.name+"_container",params.url,{start: _start});
    	} else if(params.mode == "save") {

    	    if($("textarea").size() > 0) {
        	    $("textarea").each(function(){
        	        if(typeof tinyMCE == "object") {
            	        var ed = tinyMCE.get(this.id);
            	        if(ed) { this.value = ed.getContent(); }
        	        }
        	    });
    	    }

    	    var _form = $("#"+params.name+"_form");
    	    if(_form.size() > 0) {
    	        if(jQuery.browser.mozilla) {
                    _form.unbind("submit").submit(function(){
                        if($(this).valid()) {
            		        app.ajax.toggleEditor();
            	            app.ajax.submit(this, params.url, {_m:params.mode,start:_start}, app.ajax._callback);
            		    }
            		    return false;
            		});
            		_form.submit();
    	        } else if(jQuery.browser.msie) {
                    var _name = params.name;
                    _form = null;
                    _form = $("#"+_name+"_form");

                    if(_form.valid()) {
                        app.ajax.toggleEditor();
                	    app.ajax.submit(_form.get(0), params.url, {_m:params.mode,start:_start}, app.ajax._callback);
                    }
                    return false;
                }
    	    }
    		return false;
    	}

    	params=null;
    	return;
    }

 }

 function initBtn(id) {
    if(typeof id == "object" && id.size()>0) id = id.get(0).id;
    var input_btn_tools = (id)?$("#"+id+" :button.btn_tools,#"+id+" :submit.btn_tools"):$(":button.btn_tools,:submit.btn_tools");
    if(input_btn_tools.size() > 0) input_btn_tools.buttonStyle();
 }

 function changeTextSize(flag) {
    if(flag == 0) {
        $("body").removeClass("med").removeClass("larg");
    } else if(flag == 1) {
        $("body").removeClass("larg").addClass("med");
    } else if(flag == 2) {
        $("body").removeClass("med").addClass("larg");
    }

 }

 $(document).ready(function() {
     initBtn();
     if(typeof MM_preloadImages == 'function' && MM_preloadImages.constructor == Function) {
         var src = '';
         $('div#moderntrade_topmenu img[src]').each(function(){
              src += ((src)?",":"")+"'" + this.src.replace('.gif','_on.gif')+"'";
         });
         eval("MM_preloadImages("+src+");");
     }
 });
 var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);

   return output;
}
function toggleShow(elm,id){
    var tr = $('tr[id=tr_'+id+']');
    tr.toggle();
    if(tr.css('display')=='none') {
   	 	elm.src = elm.src.replace('/icon-minus.gif','/icon-plus.gif');
    } else {
        elm.src = elm.src.replace('/icon-plus.gif','/icon-minus.gif');
    }
}
function toggleEditor(id) {
    var elm = $(id);
    if(!elm) return;
	if (tinyMCE.getInstanceById(id) == null){
        tinyMCE.execCommand('mceAddControl', false, id);
	}else{
        tinyMCE.execCommand('mceRemoveControl', false, id);
    }
}
function checkEventBlack(objEvent){
	if($('#f_username').val() && $('#f_pwd').val()){
		// || objEvent.keyCode =='9'
		if(objEvent.keyCode == '13'){
			checkLogin();
		}
	}
}
function checkEventFront(objEvent){
	if($('#f_username').val() && $('#f_pwd').val()){
		// || objEvent.keyCode =='9'
		if(objEvent.keyCode == '13'){
			LoginAccount();
		}
	}
}
function SortData(fields){
	document.getElementById('fields_sort').value=fields;
	if(document.getElementById('order').value=="desc")
		document.getElementById('order').value="asc";
	else
		document.getElementById('order').value="desc";
	document.forms[0].submit();
}
