/* ********************************************************* 
    QCore
    v1.0 Qdos Computer Consultants Ltd http://www.qdoscc.com
   ********************************************************* */


var RequestTypes = {CallBack:'CallBack',Direct:'Direct',PostBack:'PostBack',AsyncPostBack:'AsyncPostBack',WebService:'WebService'};
function QCb(ctl,value,eventName){QCore.AutoSubmit.CallBack(ctl.name,value,eventName,ctl);}

function QCoreObject()
{
    // PROPERTIES
    this.Args = new QArgsObject();
    this.AutoSubmit = new QAutoSubmitObject();
    this.Debug = new QDebugObject();
    this.Keyboard = new QKeyboardObject();
    this.ScriptManager = new QScriptManagerObject();
    
    this.DirectRequestInitRun = false;
    this.EndRequestsRunning = 0;

    // EVENTS
    this.BodyUnload = new QEvent("QCore.BodyUnload");
    this.Docking = new QEvent('QCore.Docking');
    this.EndRequest = new QEvent('QCore.EndRequest');
    this.Init = new QEvent('QCore_Init');
    this.Ready = new QEvent('QCore.Ready');
    this.WindowResize = new QEvent("QCore.WindowResize");
    this.PostWindowResize = new QEvent("QCore.PostWindowResize");

    // METHODS
    this.onBodyUnload = function(){ this.BodyUnload.Raise(); }
    this.onBeginRequest = function(sender,args){
        if (typeof(args._request) != 'undefined'){ 
            if (args._request._headers['Cache-Control'] == 'no-cache') {
                args._request._headers['Cache-Control'] = 'no-cache,no-store';
            }
        }        
    }
    this.onDocking = function(){
        var args = {Cancel:false};
        QCore.Docking.Raise(args);
        //if (!args.Cancel){ $('.QDock').QDock(); }
    }
    this.onEndRequest = function(sender, args) {
        QCore.Debug.WriteLine('QCore.onEndRequest ************************************************************');
        QCore.EndRequestsRunning += 1
        var eventargs = {sender:sender,args:args};
        QCore.EndRequest.Raise(eventargs);
        QCore.Args.ProcessResponse(sender,args);
        var ReturnArgs = QCore.Args.ProcessArgs();
        QCore.onInit(ReturnArgs);
        QCore.EndRequestsRunning -= 1
    }
    this.onInit = function(ReturnArgs){
        var InitArgs = new this.InitEventArgs(ReturnArgs);
        QCore.Debug.WriteLine('QCore.onInit\n'+ObjectToString(ReturnArgs[0],'        '));
        QCore.Init.Raise(InitArgs); 
    }
    this.onReady = function(e) {
        try {
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(QCore.onEndRequest);
            Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(QCore.onBeginRequest);
        } catch (e) { }
        var ReadyArgs = [[RequestTypes.Direct, '']];
        QCore.Args.SetRequestType(ReadyArgs);
        QCore.onInit(ReadyArgs);
        QCore.Ready.Raise();
        QCore.DirectRequestInitRun = true;
        $('body').bind("unload", QCore.onBodyUnload);
    }
    this.onWindowResize = function(e){ 
        QCore.WindowResize.Raise(e); 
        QCore.PostWindowResize.Raise(e); 
    }
    // SUB CLASSES
    this.InitEventArgs = function(Args){
        this.ReturnArgs = Args;
        this.UpdatedControls = QCore.Args.GetUpdatedControls(Args);
        this.$UpdatedControls = $(this.UpdatedControls);
        this.$ctlsByClass = function(ClassName){
            var $ctls = $("."+ClassName,this.$UpdatedControls);
            var ctls = $ctls.get();
            this.$UpdatedControls.each(function(){
                if ($(this).hasClass(ClassName)){
                    ctls[ctls.length] = this;
                }
            });
            return $(ctls);            
        }
    }
}
// **************** Q KEYBOARD MANAGER *************************/
function QKeyboardObject(){
    this.isCtrl = false; 
    $(document)
        .keyup(function (e) { 
            if(e.which == KEY_CTL) QCore.Keyboard.isCtrl=false; 
        })
        .keydown(function (e) { 
            if(e.which == KEY_CTL) QCore.Keyboard.isCtrl=true; 
            /*
            if(e.which == 83 && isCtrl == true) { 
                //run code for CTRL+S -- ie, save! 
                return false; 
            } */
        });
}
// **************** QSCRIPT MANAGER ***********************/

function QScriptManagerObject(){
    this.sm = function(){ try{return Sys.WebForms.PageRequestManager.getInstance()}catch(e){return null} }
    this.$PanelsToRefresh = function(){
        if(this.sm() != null && this.sm()._panelsToRefreshIDs != null){ 
            var selector = '';
            for (var i=0;i<this.sm()._panelsToRefreshIDs.length;i++) {
                selector += '#'+this.sm()._panelsToRefreshIDs[i].replace(/[$]/g,"_")+',';
            }
            return $(selector); 
        } else { return null; }
    }
    this.$UpdatePanelIDs = function(){
        if(this.sm() != null){ return $(this.sm()._updatePanelClientIDs); } else { return null; }
    }
}

// **************** Q AUTO SUBMIT **************************/

function QAutoSubmitObject()
{
    this.debug = false;
    this.FriendlyErrorMessage = '';
    // METHODS
    this.CallBack = function(name,value,eventName,ctl){
        var CallBackArgs = {Control:ctl,EventName:eventName,Value:value,Cancel:false};
        QCore.AutoSubmit.PreCallBack.Raise(CallBackArgs);
        var context = null;
        if(ctl){
            $(ctl).removeClass('AutoCallBackError').addClass('Updating');
	        context = ctl;
        }else{ context = 'No Context'; }
	    var arg = eventName+':'+value;
	    try {
	        var AspNetForm = theForm;
	        __theFormPostData = "";
            __theFormPostCollection = new Array();
            var $Forms =  $('form');
            $Forms.each(function(){
	            theForm = this;
	            WebForm_InitCallback();
	        });
	        theForm = AspNetForm;
	        QCore.Debug.WriteLine('WebForm_DoCallback >> name:'+name+', eventName:'+eventName+', value:'+value);
	        //WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync)
	        WebForm_DoCallback(name,arg,QCore.AutoSubmit.CallComplete,context,QCore.AutoSubmit.CallFailed,true);
	    }catch(e){
	        alert(e);
	    }
    }
    this.CallComplete = function(arg, context) {
        QCore.Debug.WriteLine('CallComplete Start <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<');
        if (QCore.AutoSubmit.debug) { alert('CallComplete:' + arg); }
        QCore.Args.ProcessString(arg);
        QCore.Args.ProcessArgs();
        var args = QCore.Args.CurrentArgs;

        var CallBackArgs = new QCore.InitEventArgs(args);
        CallBackArgs.Control = context;
        //QCore.Debug.WriteLine('QCore.AutoSubmit.CallBackComplete()\n'+ObjectToString(CallBackArgs,'        '));
        QCore.AutoSubmit.CallBackComplete.Raise(CallBackArgs);

        if (args.length > 0) { if (args[0][0] == 'Error') { QCore.AutoSubmit.CallFailed(args[0][1], context); return false; } }
        if (!context) { return ''; }
        if (context != 'No Context') {
            $(context).removeClass('Updating').addClass('Saved');
            var id = context.id;
            if (id == "") { id = context.name; }
            setTimeout("QCore.AutoSubmit.CallComplete_SaveHide('" + id + "');", 1500);
        }
    }
    this.CallComplete_SaveHide = function(context){
        var ctl = document.getElementById(context);
        if (ctl == null){ ctl = document.getElementsByName(context)[0]; }
        if (ctl != null){ $(ctl).removeClass('Saved'); }
    }
    this.CallFailed = function(error,context){
        if (QCore.AutoSubmit.debug){alert('CallFailed');}

        var CallBackArgs = {Control:context,Error:error};
        QCore.AutoSubmit.CallBackFailed.Raise(CallBackArgs);

        if (context){
            try {
                $(context).removeClass('Updating').addClass('AutoCallBackError');
            }catch(e){}
        }
        if (QCore.AutoSubmit.FriendlyErrorMessage != '' && QCore.AutoSubmit.debug == false){
            alert(this.FriendlyErrorMessage);
        }else{ alert('ERROR:\n'+error);}
    }
    // EVENTS
    this.CallBackComplete = new QEvent("QAutoSubmitObject_CallBackComplete");
    this.CallBackFailed = new QEvent("QAutoSubmitObject_CallBackFailed");
    this.PreCallBack = new QEvent("QAutoSubmitObject_PreCallBack");
    
    // SUB CLASSES
    
}//QAutoSubmitObject

// **************** Q DEBUG **************************/

function QDebugObject() {
    this.DebugMode = false;
    this._$DebugConsole = null;
    this.$DebugConsole = function(){
        if (this._$DebugConsole == null){
            this._$DebugConsole = $('<div></div>');
            this._$DebugConsole
                .addClass("DebugConsole")
                .addClass("DebugConsoleMin")
                .dblclick(function(){
                    $(this).toggleClass("DebugConsoleMin");
                });
            $('body').append(this._$DebugConsole);
        }
        return this._$DebugConsole;
    }
    
    this._$StackMonitor = null;
    this.$StackMonitor = function(){
        if (this._$StackMonitor == null){
            this._$StackMonitor = $('<textarea></textarea>');
            this._$StackMonitor
                .addClass("QDebug_StackMonitor")
                .addClass("QDebug_StackMonitorMin")
                .dblclick(function(){
                    $(this).toggleClass("QDebug_StackMonitorMin");
                });
            $('body').append(this._$StackMonitor);
        }
        return this._$StackMonitor;
    }
    this._StackTrace = '';
    this.StackTrace = function(){
        return this._StackTrace;
    }
    this.WriteLine = function(message){
        this._StackTrace = '- '+message+'\n\n'+this._StackTrace;
        if (this.DebugMode){
            this.$StackMonitor().val(this._StackTrace);
            //var stack = this.$StackMonitor().get(0);
            //stack.scrollTop = stack.scrollHeight;
        }
    }
}

// **************** Q ERROR HANDLER **************************/

function QErrorHandlerObject() {
    this.log = function(Error) {
        var ErrorMessage = '';
        if (typeof (Error) == 'string') {
            ErrorMessage = Error;
        } else {
            ErrorMessage = Error.Message;
        }
        if (QCore.Debug.DebugMode) {
            QCore.Debug.WriteLine(ErrorMessage);
            if (!confirm(ErrorMessage + "\n\nPress Cancel to see stack trace")) {
                alert(QCore.Debug.StackTrace());
            }
        }
        var curTime = new Date();
        var timeStamp = curTime.getHours() + curTime.getMinutes() + curTime.getSeconds();
        $.post('?qeh=' + timeStamp, { ErrorMessage: ErrorMessage, StackTrace: QCore.Debug.StackTrace() }, null);
    }
}
function QException(Sender,Message){
    var o = new Object();
    o.Sender = Sender;
    o.Message = Message;
    return o;
}

// **************** Q CREATE OBJECTS AND INITIALISE **************************/
var QCore = new QCoreObject();
var QEH = new QErrorHandlerObject();

$().ready(QCore.onReady);
$(window).bind("resize",QCore.onWindowResize);

/* ********************************************************* 
    RETURNARGS
    v1.0 Qdos Computer Consultants Ltd http://www.qdoscc.com
   ********************************************************* */
function QArgItemsObject(){
    this.RequestType = '';
    this.ArgString = '';
    this.ArgItems = null;
    
    // METHODS
    this.Initialise = function(ArgsString){
        this.ArgString = ArgsString;
    }
}

function QArgsObject() {
    this.Debug = false;
    this.CurrentArgs = null;
    
    // METHODS
    this.GetUpdatedControls = function(args){
        if (typeof(args) == 'undefined'){ args = QCore.Args.CurrentArgs;}
        var UpdatedControls = [];
        if (args){
            for (var i=1;i<args.length;i++) {
                if(args[i].ActionType == 'RenderControl'){
                    var RenderSettings = eval(args[i].NewValue);
                    var RenderCtl = document.getElementById(RenderSettings.ctl);
                    if (!RenderCtl){ RenderCtl = document.getElementById(args[i].Identifier); }
                    if (RenderCtl){ UpdatedControls[UpdatedControls.length] = RenderCtl; }
                }   
            }
        }
        if (typeof(args) != 'undefined' && args && typeof(args.RequestType) != 'undefined'){
            switch (args.RequestType) {
                case RequestTypes.AsyncPostBack :
                    var $Panels = QCore.ScriptManager.$PanelsToRefresh();
                    if ($Panels != null) { $Panels.each(function(){UpdatedControls[UpdatedControls.length] = this;}); }
                    break;
                case RequestTypes.Direct : UpdatedControls = [document];
                    break;
                default : UpdatedControls = [document];
                    break;
            }
        }
        if (UpdatedControls.length == 0){ UpdatedControls = [document]; }
        return UpdatedControls;
    }

    this.onPreProcessArg = function(Arg){ this.PreProcessArg.Raise({ArgItem:Arg}); }
    this.onProcess = function(){ this.Process.Raise({ArgItems:this.CurrentArgs}); }
    this.ProcessArgs = function(){ if(QCore.Args.CurrentArgs != null){return ReturnArgs_Process();} }

    this.ProcessString = function(ArgString){
        this.PreProcessString.Raise();
        if(ArgString == ''){return [['NoArgs','']];}
        if(this.Debug){alert(ArgString);}
        try { 
            eval("var args = "+ArgString+";");
            QCore.Args.CurrentArgs = args;
            this.SetRequestType(args);
            return args;
        }catch(e){
            QCore.Args.CurrentArgs = null;
            alert('Error:There was a problem parsing ArgString: '+e.toString()+'/n'+ArgString.toString());
        }
        return QCore.Args.CurrentArgs;    
    }
    this.ProcessResponse = function(sender,args){
        if (args._response){ 
            if (args._response.get_responseAvailable()) {
                    var ReturnArgs = args._response.getResponseHeader('ReturnArgs');
                    if(ReturnArgs != ''){ return this.ProcessString(ReturnArgs);}
            }
        }
        QCore.Args.CurrentArgs = null;
        return;
    }
    this.SetRequestType = function(args){
        switch (args[0][0]){
            case RequestTypes.CallBack : args.RequestType = RequestTypes.CallBack; break;
            case RequestTypes.PostBack : args.RequestType = RequestTypes.PostBack; break;
            case RequestTypes.AsyncPostBack : args.RequestType = RequestTypes.AsyncPostBack; break;
            case RequestTypes.WebService : args.RequestType = RequestTypes.WebService; break;
            default : args.RequestType = RequestTypes.Direct; break;
        }
    }    
    
    // EVENTS
    this.PreProcessString = new QEvent('QArgs_PreProcessString');
    this.PreProcessArg = new QEvent('QArgs_PreProcessArg');
    this.Process = new QEvent('QArgs_Process');
}

function ReturnArg(Identifier,IdentifierType,NewValue,ActionType)
{
    this.Identifier = Identifier;
    this.IdentifierType = IdentifierType;
    this.NewValue = NewValue;
    this.ActionType = ActionType;
}

function ReturnArgs_Process()
{   
    var args = QCore.Args.CurrentArgs;
    if (args == null){return;}
    if (typeof(args) == "undefined"){return;}    
    QCore.Args.onProcess();
    if (args == null){return;}
    if (typeof(args) == "undefined"){return;}
    if(args.length > 0){if(args[0][0] =='Error'){return args}}
    var ctl = null;
    for (var i=1;i<args.length;i++)
    {
        if (QCore.Args.Debug) { AlertObject(args[i]); }
        ctl = null;
        QCore.Args.onPreProcessArg(args[i]);
        QCore.Debug.WriteLine('Process Arg\n'+ObjectToString(args[i],'        '));
        switch (args[i].IdentifierType) {
            case 'CssClass':
            break;
            case 'ControlID':
                var ctl = document.getElementById(args[i].Identifier);
                //if (!ctl){return [['Error','Cannot find any controls with the id: '+args[i].Identifier]];}
            break;
            case 'ControlName':
                alert('ctlname');
                var ctls = document.getElementsByName(args[i].Identifier);
                alert(ctls.length);
                if (ctls.length == 0){
                    var ctl=null;
                }else{
                    var ctl=ctls[0];
                }
                //if (!ctl){return [['Error','Cannot find any controls with the id: '+args[i].Identifier]];}
            break;
            case 'jQuerySelector' :
                var selector = args[i].Identifier.split(",");
                try {
                    var $ctl = $(selector[0],selector[1]);
                    var ctl = $ctl.get(0);
                }catch(e){
                    ctl=null;
                }
            break;
        }

        var RunAction = true;
        if (!ctl) { RunAction = false; }
        if (args[i].IdentifierType == 'NoIdentifier') { RunAction = true; }
        if (args[i].ActionType == 'RenderControl') { RunAction = true; }
        if(!RunAction){ 
            QEH.log(QException(this,"Cannot find ctl from identifier"));
        }
        if(RunAction){
        switch (args[i].ActionType) {
            case 'AddClass' : 
                if (!$(ctl).hasClass(args[i].NewValue)){
                    $(ctl).addClass(args[i].NewValue);
                }
                break;
            case 'Alert' : alert(args[i].NewValue);
                break;
            case 'Dialog' : ShowDialog(args[i].NewValue);
                break;
            case 'DisableTab' : $(ctl).disableTab('#'+args[i].NewValue);
                break;
            case 'EnableTab' : $(ctl).enableTab('#'+args[i].NewValue);
                break;
            case 'OpenWindow' :
                var WindowOptions = eval(args[i].NewValue);
                var wleft = (screen.width - WindowOptions.Width) / 2;
                var wtop = (screen.height - WindowOptions.Height) / 2;
                window.open(WindowOptions.PageUrl,WindowOptions.Title, 'width='+WindowOptions.Width+' height='+WindowOptions.Height+' left='+wleft+' top='+wtop+' directories=no, location=no, menubar=no, resizable=yes, status=no, toolbar=no');
                break;
            case 'Redirect' :
                window.location = args[i].NewValue;
                break;
            case 'Refresh' : 
                var ctlTagName = ctl.tagName.toLowerCase();
                switch (ctlTagName){
                    case 'img': 
                        //var src = ctl.src;
                        ctl.src = '';
                        ctl.src = args[i].NewValue.replace(/&amp;/g,"&");
                        break;
                }
                break;
            case 'RequireResource' : 
                var RequireResourceSettings = eval(args[i].NewValue);
                $().QRequireResource(RequireResourceSettings.Resource,RequireResourceSettings.Type);
                break;
            case 'RemoveClass' : $(ctl).removeClass(args[i].NewValue);
                break;
            case 'RemoveControl' : 
                $(ctl).remove();
                break;
            case 'RenderControl' : 
                var RenderSettings = eval(args[i].NewValue);
                if (QCore.Args.Debug) { AlertObject(RenderSettings); }
                var RenderCtl = document.getElementById(RenderSettings.ctl);
                if (RenderCtl){ 
                    $('#'+RenderSettings.ctl).replaceWith(RenderSettings.val);                    
                }else{ 
                    $(ctl).append(RenderSettings.val); 
                }
                break;
            case 'RunScript' : 
                try {
                    eval(args[i].NewValue);
                }catch(e){
                    QEH.log(e);
                }
                break;
            case 'ScrollTo' : 
                // find parent which has overflow auto or scroll
                var parent = FindScrollContainer(ctl);
                if(parent){
                    $(parent).scrollTo(ctl,args[i].NewValue);
                }else{
                    // if none use window
                    $.scrollTo(ctl,args[i].NewValue);
                }
                
                break;
            case 'TriggerTab' : $(ctl).triggerTab(args[i].NewValue);
                break;
            case 'UpdateClass': ctl.className = args[i].NewValue; 
                break;
            case 'UpdateValue':
                var ctlTagName = ctl.tagName.toLowerCase();
                switch (ctlTagName){
                    case 'iframe':
                        ctl.src = args[i].NewValue;
                        break;
                    case 'input':
                        var type = ctl.type.toLowerCase();
                        if(type == 'checkbox'){ctl.checked = parseBool(args[i].NewValue);}
                        else if(ctl.value !== null){ctl.value = args[i].NewValue;}
                        break;
                    case 'select' :
                        try {
                            var UpdateValue_SelectSettings = eval(args[i].NewValue);
                            switch (UpdateValue_SelectSettings.Action){
                                case 'Add' :
                                    $(ctl).addOption(UpdateValue_SelectSettings.Value,UpdateValue_SelectSettings.Text);
                                    break;
                                case 'Remove' :
                                    $(ctl).removeOption(UpdateValue_SelectSettings.Value);
                                    break;
                                case 'SelectedIndex' :
                                    ctl.selectedIndex = UpdateValue_SelectSettings.SelectedIndex; 
                                    break;
                            }
                        }catch(e){
                            QEH.log(QException(ctl,e));
                        }
                        break;
                    case 'textarea' : ctl.value = args[i].NewValue; 
                        break;
                    case 'div' : case 'span': case 'a':
                        switch (ctl.className.toLowerCase()) {
                            case 'qcalendarpicker': case 'qcalendarpicker_readonly':
                                QCalendarPicker_ChangeValue(args[i].Identifier,args[i].NewValue);
                                break;
                            default:
                                ctl.innerHTML = args[i].NewValue;
                                break;
                        }
                        break;
                    case 'img': 
                        ctl.src = args[i].NewValue;
                        break;
                }
            break;
        } // close switch(args[i].ActionType)
        } //end if(RunAction)
    }
    return args;
}




