//Framework javascript class


var Framework = function(PageName, MenuPage, MainPage, options){

    this.setOption = function(name, value){
        this.options[name] = Array(value, false);
    };

    this.resizePage = function()
    {
        var cheight = parseInt(getStyle(this.contentDiv, "height"));
        var mheight = parseInt(getStyle(this.menuDiv, "height"));
        if(cheight > mheight)		heightto(cheight+10, this.menuDiv);
    };

    this.loadJavaScript = function (url, scriptName)
    {
        if(scriptName === ""){
            var e = document.createElement("script");
            e.src = url;
            e.type="text/javascript";
            document.getElementsByTagName("head")[0].appendChild(e);
        }
        else
        {
            document.getElementById(scriptName).src = url;
        }
    };

    this.newUser = function()
    {
        var index = this.alertBox('', abGeneral, function(status){}, {
            'Title':'New User',
            'Display':true,
            'ButtonWord':'Cancel'
        });
        this.user.options['ResetPassword'] = 'false';
        this.user.options['Signup'] = 'false';
        this.user.landingPage = 'data/index.php';
	
        this.user.BuildLogin(this.msgBox[index-1].ReturnMsgBox().id, 'tuser');
        this.user.SignUp();
        var self = this;
        tuser.onComplete = function(msg){
            self.closeAlert();
        }
        this.msgBox[index-1].Display();
    }

    this.loadPage = function(url, Options)
    {
        this.btns = new Array();
        this.contentDiv.innerHTML = "<h1>Loading Page: "+url+"</h1>";

        var self = this;
        Options = Options || "";

        window.status="currently loading "+url;
		
        url="getpage.php?Page=" + url;
	
        var index = this.history.push(new Page(url, Options));
		
        this.history[index-1].onCompletion = function(){
            self.history[index-1].setHTML(self.contentDiv.id);
            self.resizePage();
        };
        this.history[index-1].refreshPage();
    };
	
    this.refreshPage = function()
    {
        this.history.last().refreshPage();
    //this.history[this.history.length].refreshPage();
    };

    this.back = function()
    {
        if(this.history.length-2 >= 0){
            this.history[this.history.length-2].refreshPage();
        } else {
            window.location.href = window.location.href;
        }

    }

    this.addBtn = function(btnName, btnValue, btnFunction, btnParent, btnImages, btnClass)
    {
        var self = this;
        var index = this.btns.push(new Button(btnName, btnValue, btnParent, btnImages));
        this.btns[index-1].onClick = function(val) {
            btnFunction(val);
        };
    };
	
    this.getData = function(url, hndler, dest)
    {
        var self = this;
        var a = new sack();
        a.requestFile = url;
        var hndler = hndler || function(msg) {};

        a.onCompletion = function(){
            hndler(a.response);
            if(dest) {
                a.sethtml2(dest);
            }
            a = null;
        };
        a.runAJAX();
    }
	
    this.loadMenu = function()
    {
        var self = this;
        url="getpage.php?Page=" + self.MenuPage;

        var a = new sack();
        a.requestFile = url;
	
        a.onCompletion = function()
        {
            a.sethtml(self.menuDiv.id);
            self.resizePage();
        };

        a.runAJAX();
    };
	
    this.alertBox = function (message, options, completeAction, style)
    {
        this.Log("alertBox called.", "Debug", "jsclass_Navigator");
        var index = this.msgBox.push(new AlertBox(message, 4, completeAction, options));
        return index;
    };

    this.WizardBox = function (Name, options, completeAction, style)
    {
        this.Log("WizardBox called.", "Debug", "jsclass_Navigator");
        this.Wizard = new Wizard(Name);
        var self = this;
        this.Wizard.Complete = completeAction || function() {
            self.Wizard.close();
        };
    };
	
    this.closeAlert = function()
    {
        this.Log("alertBox closed", "Debug", "jsclass_Navigator");
        var tbox = this.msgBox.pop();
        tbox.Close();
        tbox = null;
    };

    this.infoBox = function (message)
    {
        this.Log("infoBox called.", "Info", "jsclass_Navigator");
        var index = this.msgBox.push(new AlertBox(message, 0, function() {
            Navigator.closeAlert();
        } , {
            'Display':true
        }));
        return index;
    };
	
    this.postForm = function (url, Form, hndler, destination)
    {
        this.Log("postForm called."+url+"-"+Form.name, "Info", "jsclass_Navigator");
        var self = this;
        var a = new sack();
        a.requestFile = url;
	
        var hndler = hndler || function(msg) {};
        for(i = 0; i < Form.elements.length; i++){
            if (Form.elements[i].type=="select-one"){
                for(j=Form.elements[i].options.length-1; j>=0; j--)
                {
                    selectedValue = Form.elements[i].options[j].value;
                    selectedText = Form.elements[i].options[j].text;
                    if(Form.elements[i].options[j].selected){
                        a.setVar(Form.elements[i].name, selectedValue);
                    }
                }
            } else if(Form.elements[i].type=="select-multiple"){
                tval = "";
                for(j=Form.elements[i].options.length-1; j>=0; j--)
                {
                    selectedValue = Form.elements[i].options[j].value;
                    selectedText = Form.elements[i].options[j].text;
                    if(Form.elements[i].options[j].selected){
                        tval = tval+selectedValue.trim() +"^";
                    }
                }
                a.setVar(Form.elements[i].name, tval);
            } else {
                if(Form.elements[i].type === 'password'){
                    var x = MD5(document.iForm.elements[i].value);
                    a.setVar(Form.elements[i].name, x);
                } else {
                    a.setVar(Form.elements[i].name, Form.elements[i].value);
                }
            }
        }
		
        this.alertBox("Posting Information.  Please wait",  {
            'Display':true
        }, function(success){});
        a.onCompletion = function(){
            self.closeAlert();
            hndler(a.response);
            if(destination) {
                a.sethtml2(destination);
            }
            self.Log("postForm successfull", "Info", "jsclass_Navigator");
            a = null;
        };
        a.onError = function(msg) {
            this.Log("postForm "+msg, "High", "jsclass_Navigator");
        };
        a.runAJAX();
    };

    this.runPage = function(url)
    {
        var a = new sack();
        a.requestFile = url;
        a.runAJAX();
    }
	
    this.calender = function(obj, hndler)
    {
        if (typeof(Calendar) !== "undefined"){
            this.loadJavaScript("java/Calender.js", "")
        }
        addEvent(obj, "click", function(e){
            var pos = getMousePosition(e);
            var Cal = new Calendar();
            Cal.Option('greyout', true);
            Cal.Complete = hndler || function(year, month, day)
            {
                obj.value = (month)+'/'+day+'/'+year;
                Cal.Close();
            };
            var cdate = new Date(obj.value);
            Cal.ShowCalender(document.getElementById('wrap'),pos[0], pos[1], cdate.getMonth(), cdate.getFullYear());
        });
    };
	
    this.runSP = function(Name, Values, hndler)
    {
        this.Log("RunSP called -"+Name+", "+Values, "Info", "jsfunctions");
        var a = new sack();
        a.requestFile = "php/ajaxquery.php";
        a.setVar('sp', Name);
        a.setVar('values', Values);
	
        a.onCompletion = hndler || function(){ };
        a.runAJAX();
    }
	
    this.formPop = function(url, formoptions, pagestring)
    {
        this.Log("formPop called", "Info", "jsclass_Navigator");
        //url= url || "getpage.php?Page=none.php";
        if(!url){
            this.Log("formPop called with no url assigned", "Warning", "jsclass_Navigator");
            exit;
        }
		
        formoptions = formoptions || {
            'Display':true
        };
        var self = this;
        var a = new sack();
        a.requestFile = url;
        a.setVar("ID", 'PopDiv');
        pagestring = pagestring || "";
        if(pagestring !== ""){
            var pageoptions = pagestring.split(",");
            for(var i = 0; i < pageoptions.length; i++)
            {
                var t = pageoptions[i].split("=");
                a.setVar(t[0].trim(), t[1].trim());
            }
        }
        formoptions.ButtonWord = "Close";
        var index = this.msgBox.push(new AlertBox("Loading...", abGeneral, function(status){
            self.msgBox.pop().Close();
        }, formoptions ));
	
        a.onCompletion = function()
        {
            self.Log("formPop successfull"+a.response, "Debug", "jsclass_Navigator");
            a.sethtml2(self.msgBox[index-1].ReturnMsgBox().id);
            this.msgBox[index-1].Display()
        };
        a.onError = function(msg){
            this.Log("formPop error"+msg, "High", "jsclass_Navigator");
        };
        a.onFail = function(msg){
            this.Log("formPop error"+msg, "High", "jsclass_Navigator");
        };
        a.runAJAX();
    };
	
    this.Log = function(msg, severity, page)
    {
        var self = this;
        var a = new sack();
        a.requestFile = this.logPage;
        a.setVar("Message", msg);
        a.setVar("Severity", severity);
        a.setVar("Sender", page);
        a.runAJAX();
    }

    this.PageName = PageName || "FrameworkPage";
    this.MenuPage = MenuPage || "FrameworkPage";
    this.logPage = options.LogPage || "php/logger.php";
    this.options = options || {};
	
    this.user = new User();
    this.contentDiv = document.getElementById(this.options.contentDiv) || document.createElement('div');
    this.menuDiv = document.getElementById(this.options.menuDiv) || document.createElement('div');

    this.msgBox = new Array();
    this.history = new Array();
    this.btns = new Array();
    this.onLoadPage = function(msg){};

    this.user.onLogin = function(msg){
        self.Log(msg, "Info", "jsclass_Navigator");
    };
};

var Page = function(PageName, options){
    this.name = PageName;
    this.values = options;
    this.pageHTML = "";
	
    this.refreshPage = function()
    {
        var self = this;
        var a = new sack();
        a.requestFile = this.name;

        var oTemp = this.values.split("&");
        var pHolder = new Array();
			
        for(i = 0; i < oTemp.lenght; i++){
            pHolder = oTemp[i].split("=");
            a.setVar(pHolder[0], pHolder[1]);
        }
	
        a.onCompletion = function()
        {
            self.pageHTML = a.response;
            self.onCompletion();
        };
        a.onFail = function()
        {
            self.onFail();
        };
        a.onError = function()
        {
            self.onError();
        };
        a.runAJAX();
    };

    this.setHTML = function(div) {
        document.getElementById(div).innerHTML = this.pageHTML;
        var search = this.pageHTML;
        var script;
        var endscript;
        var start;
        var end;
        var block;
        var name;
        var param;
        var func;
	  
        var is_singleq = 0;
        var singleq = "'";
        var is_doubleq = 0;
        var doubleq = '"';
        var is_escaped = 0;
        var escap = "\\";
        var layer = 0;
          
        while( script = search.match(/(<script[^>]+javascript[^>]+>[\s\n\r]*(<!--)?)/)) {
            start =  search.indexOf(script[0]);
            search = search.substr(start + script[0].length);
            if (!(endscript = search.match(/((-->)?\s*<\/script>)/))) break;
            end = search.indexOf(endscript[0]);
            block = search.substr(0, end);
            search = search.substring(block.length + endscript[0].length);
       
            while(func = block.match(/(function(.s?)\((.*?)\)\s*\{)/))
            {
                name = func[2];
                param = func[3];
                start = block.indexOf(func[0])
                eval(block.substr(0,start));
                // for evaluating non functions
          
                block = block.substr(start + func[0].length);

          
                is_singleq = 0;
                is_doubleq = 0;
                is_escaped = 0;
                layer = 0;
          
          
                for(i=0;i<block.length;i++) {
                    c = block.substr(i,1);
             
                    if ((is_singleq || is_doubleq) && is_escaped) {
                        is_escaped = 0;
                    } else if (!is_doubleq && (c==singleq)) {
                        is_singleq = !is_singleq;
                    } else if (!is_singleq && (c==doubleq)) {
                        is_doubleq = !is_doubleq;
                    } else if ((is_singleq || is_doubleq) && (c==escap)) {
                        is_escaped = 1;
                    } else if ( c=="{") {
                        layer++;
                    } else if ( c=="}") {
                        if ( layer==0 ) {
                            break;
                        }
                        layer--;
                    }
                }
          
                code = block.substr(0,i-1);
                block = block.substr(i +1);
          
                code = code.replace(/\n/g, '\\n');
                code = code.replace(/\r/g, '\\r');
                code = code.replace(/'/g,"\\'");
          
                eval(name + " = new Function('"+param+"','"+code+"');");
            }
      
      
      
            try
            {
                eval(block);
            } catch (e) {
                alert(e);
            }
        // for evaluating non functions
        }
    };
	
    this.resetFunctions = function() {
        this.onLoaded = function() { };
        this.onCompletion = function() { };
        this.onError = function() { };
        this.onFail = function() { };
    };
	
    this.resetFunctions();
};


function Button(btnName, btnValue, btnParent, btnImages, btnClass)
{
    this.resetFunctions = function()
    {
        var self = this;
        this.onMouseOver = function(){
            self.img.src =  self.imgArray['Hover'].src;
        };
        this.onMouseDown = function(){
            self.img.src =  self.imgArray['Down'].src;
        };
        this.onMouseOut = function(){
            self.img.src =  self.imgArray['First'].src;
        };
        this.onMouseUp = function(){
            self.img.src =  self.imgArray['First'].src;
        };

        this.onClick = function(){};
    };

    this.onClick = function()
    {
        this.btnFunction(this.Value);
    };

    this.Name = btnName;
    this.Value = btnValue;
    this.Parent = btnParent;
    this.Enabled = true;
    this.btn = document.createElement('div');
    this.imgArray = new Array();
    var self = this;
    this.resetFunctions();
	
    for(var i = 0; i < btnImages.length; i++)
    {
        this.imgArray[btnImages[i].name] = document.createElement('img');
        this.imgArray[btnImages[i].name].src = btnImages[i].url;
    }
    this.img = document.createElement('img');
    this.btn.appendChild(this.img);
    this.img.src =  this.imgArray['First'].src;
    this.btn.id = this.Name;
	
    addEvent(this.btn.childNodes[0], "click", function(e) {
        self.onClick();
    });
    addEvent(this.btn.childNodes[0], "mouseover", function(e) {
        self.onMouseOver();
    });
    addEvent(this.btn.childNodes[0], "mousedown", function(e) {
        self.onMouseDown();
    });
    addEvent(this.btn.childNodes[0], "mouseout", function(e) {
        self.onMouseOut();
    });
    addEvent(this.btn.childNodes[0], "mouseup", function(e) {
        self.onMouseUp();
    });
    btnParent.appendChild(this.btn);
};


