/*
* This is the CMinder namespace.  All js objects and methods should be placed in this
* namespace to avoid collisions with other functions and objects.
*/
// Utility requires CMinder.Module version 0.1
CMinder.Module.require("CMinder.Module", 0.1);

// Create a namespace for our Class module
CMinder.Module.createNamespace("CMinder.Utility");

CMinder.Utility = {
    QueryString: [],
    populateQueryString: function() {
        var query = window.location.search.substring(1);
        var parms = query.split('&');
        for (var i=0;i<parms.length;i++) {
            var pos = parms[i].indexOf('=');
            if (pos > 0) {
                var key = parms[i].substring(0,pos);
                var val = parms[i].substring(pos+1);
                CMinder.Utility.QueryString[key] = val;
            }
        }
    },
    object: function(o) {
        function F() {};
        F.prototype = o;
        
        return new F();
    },
    insertAfter: function (parent, node, referenceNode) {
        parent.insertBefore(node, referenceNode.nextSibling);
    },
    stripHTML: function(str) {
          var re= /<\S[^><]*>/g ;
          return str.replace(re, "") ;
    },
    newGuid: function() {
        var g = "{";
        for(var i = 0; i < 32; i++)
         g += Math.floor(Math.random() * 0xF).toString(0xF) +
            (i == 8 || i == 12 || i == 16 || i == 20 ? "-" : "");
        return g + "}";
    },
    getSelectedItems: function(el) {
        if (! el) return;
        
        var options = el.getElementsByTagName('option');
        options = $A(options);
        var opt
    },
    synchronizeRangeDDL: function(elBegin,elEnd,elSource) {
        if (elSource == elBegin) {
            if(elBegin.selectedIndex > elEnd.selectedIndex)
                elEnd.selectedIndex = elBegin.selectedIndex;
        } else {
            if(elBegin.selectedIndex > elEnd.selectedIndex)
                elBegin.selectedIndex = elEnd.selectedIndex;                
        }
    },
    disableAnchor:function(obj, disable){
      if(disable){
        var href = obj.getAttribute("href");
        if(href && href != "" && href != null){
           obj.setAttribute('href_bak', href);
        }
        obj.removeAttribute('href');
        obj.style.color="gray";
      }
      else{
        obj.setAttribute('href', obj.attributes['href_bak'].nodeValue);
        obj.style.color="blue";
      }
    },
    toggleElementExpand:function(e) {
        var el = e.target;
        var idArr = el.id.split('_');

        if (el.innerHTML == "(hide)") {
            Effect.BlindUp(idArr[1]);
            el.innerHTML = "(show)";
        }
        else {
            Effect.BlindDown(idArr[1]);
            el.innerHTML = "(hide)";
        }
    },
    getFormattedDate:function(dt, abbreviateYear) {
        if (!dt) return '';
        var month = dt.getMonth() + 1;
        if (month < 10)
            month = "0" + month;
        var day = dt.getDate();
        if (day < 10)
            day = "0" + day;
        
        var year = dt.getFullYear();
        if (abbreviateYear != null && abbreviateYear == true)
            year = (year + "").substring(2);
        return month + '/' + day + '/' + year;
    },
    getFormattedTime: function(dateValue) {
        var hours = dateValue.getHours();
        var minutes = dateValue.getMinutes();
        var timeValue = "" + ((hours >12) ? hours -12 :hours)
        if (timeValue == "0") timeValue = 12;
        timeValue += ((minutes < 10) ? ":0" : ":") + minutes
        timeValue += (hours >= 12) ? " PM" : " AM"
        return timeValue;
    },
    isDate: function (sDate) {
        var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/
        if (re.test(sDate)) {
            var dArr = sDate.split("/");
            var d = new Date(sDate);
            return d.getMonth() + 1 == dArr[0] && d.getDate() == dArr[1] && d.getFullYear() == dArr[2];
        }
        else {
            return false;
        }
    },
    alertCancel: function(text, container, header, handler, state) {
        CMinder.Utility.getAlertModal(text, "cmCancelDelete", container, header, handler, state);
	    this.modAlert.show();
    },
    alertGo: function(text, container, header, handler, state) {
        CMinder.Utility.getAlertModal(text, "cmGo", container, header, handler, state);
        this.modAlert.show();
    },
    alertDefault:function(text, container, header, handler, state) {
        CMinder.Utility.getAlertModal(text, "", container, header, handler, state);
        this.modAlert.show();
    },
    getAlertModal: function (text, cssClass, container, header, handler, state) {
        if (!handler) 
            myHandler=function(){};
        else
            myHandler = handler;
            
            
        var handlers = [ { text:"OK", cssClass:"cmGoButton", handler:function() {myHandler(state);this.hide();} }];

        if (this.modAlert)
            this.modAlert.destroy();
            
        this.modAlert = new YAHOO.widget.SimpleDialog("alertModal", {
                width:"450px",
			    visible:false,
			    modal:true,
			    fixedcenter:true,
			    draggable:false,
			    iframe:true,
			    constraintoviewport:true,
			    effect: { effect:YAHOO.widget.ContainerEffect.FADE, duration:0.5 } } );
        
        myModal = this.modAlert;
        if (!header)
		    myModal.setHeader("CampMinder");
        else
            myModal.setHeader(header);
		myModal.setBody("<p>" + text + "</p>");
		//myModal.setFooter('<button type="button" class="cmFloatRight" id="' + modalID + 'Hide">OK</button>');
		myModal.cfg.queueProperty("buttons",handlers);
		if (!container)
		    myModal.render(document.body);		
        else 
            myModal.render(container);
            
        if (cssClass)
            $(myModal.element.childNodes[0]).addClassName(cssClass);
        
        var buttons = myModal.footer.getElementsByTagName('button');
        $(buttons[0]).addClassName('cmGoButton');
        $(buttons[0]).addClassName('cmFloatRight');
        
        //YAHOO.util.Event.addListener(modalID + "Hide", "click", CMinder.Utility.hideModal, myModal);
        //return myModal;
    },
    hideModal: function(e, obj) {
        obj.hide();
        //obj.destroy();
    },
    alert:function(text) {
        alert(text);
    },
    confirm:function(header,text,container, handlerYes,handlerNo,state, cssClass) {
        if (!handlerNo) handlerNo=function(){this.hide;};
        handlers = [ { text:"Yes", cssClass:"cmGoButton", handler:function() {handlerYes(state);this.hide()} },
            { text:"No", cssClass:"cmCancelDeleteButton cmFloatRight", handler:function() {handlerNo();this.hide()}, isDefault:true } ];

        // Instantiate the Dialog 
        confirmDialog = new YAHOO.widget.SimpleDialog("divConfirmDialog",
            {width:"350px",
            close:true,
	        visible:false,
	        modal:true,
	        draggable:false,
	        fixedcenter:true,
			iframe:false,
	        constraintoviewport:true,
	        effect: { effect:YAHOO.widget.ContainerEffect.FADE, duration:0.5 } } );

        confirmDialog.cfg.queueProperty("buttons",handlers);
        
        confirmDialog.setHeader(header);
        confirmDialog.cfg.queueProperty("header",header);
        
        confirmDialog.cfg.queueProperty("text",text);
        
        if(!container)
            container = document.body;
            
        confirmDialog.render(container);
        if (cssClass)
            $(confirmDialog.element.childNodes[0]).addClassName(cssClass);
        
        var buttons = confirmDialog.footer.getElementsByTagName('button');
        $(buttons[0]).addClassName('cmGoButton');
        $(buttons[0]).addClassName('cmFloatRight');
        $(buttons[1]).addClassName('cmCancelDeleteButton');
        
        
        confirmDialog.show();
    },

    showWaitDialog:function(text, container) {
        if (!text) text='Please wait...';
        
        if (!this.waitDialog) {
            this.waitDialog = new YAHOO.widget.Panel ("waitModal", {
                width:"300px",
                fixedcenter:true,
                draggable:false,
                modal:true,
                visible:false,
                constraintoviewport:true,
                effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.5}
                }

            );
            this.waitDialog.setBody('<img src="/images/UI/cmWait.gif" width="300" height="100"/>');
            this.waitDialog.setFooter(text);
            if (!container)
                    this.waitDialog.render(document.body);
                else
                    this.waitDialog.render(container);
            
                Element.addClassName($('waitModal'),"cmWait");
            //this.waitDialog.setHeader(text);
        } else {
            this.waitDialog.setFooter(text);
        }
        
        
        this.waitDialog.show();
    }
    ,
    hideWaitDialog:function() {
        this.waitDialog.hide();
    },
    streamFile:function(url, objSession, container) {
        var guid = this.newGuid();
        if (url.indexOf("?") > -1)
            url += "&guid="  + guid;
        else
            url += "?guid=" + guid;
            
        CMinder.Utility.showWaitDialog("Preparing file for download, please wait...", container);
        if (!objSession)
            CMinder.Utility.processDownload(guid, url);
        else
            CMinder.Ajax.Utility.AddToSession(guid, objSession, url, CMinder.Utility.addToSession_callback);

    },
    addToSession_callback: function(res) {

        CMinder.Utility.processDownload(res.value.Guid, res.value.Url);
    },
    processDownload: function(guid, url) {
     var iFrame = document.createElement("iframe");
        var iFrameDiv = document.createElement("div");
        iFrameDiv.setAttribute("style", "position:absolute;top:400px;left:100px;z-index:9;");
        iFrameDiv.setAttribute("id", "d" + guid);
        iFrame.setAttribute("style", "position:absolute;top:400px;left:100px;z-index:8;visibility:hidden");
        
        iFrame.setAttribute("id", "i" + guid);
        iFrame.setAttribute("height", "1");
        iFrame.setAttribute("width", "1");

        document.body.appendChild(iFrame);
        document.body.appendChild(iFrameDiv);
  
        CMinder.Utility.navigateUrl(guid, url);
        CMinder.Utility.checkStreamProgress(guid);
    },
    navigateUrl: function(guid, url) {
        $('i' + guid).src = url;
    },
    checkStreamProgress: function (guid) {
        CMinder.Ajax.Utility.CheckStreamProgress(guid, CMinder.Utility.checkStreamProgress_callback);
       
    },
    checkStreamProgress_callback: function(res) {
        var cspr = res.value;

        if (cspr.IsComplete)
        {
            var iFrame = $("i" + cspr.Guid);
            var iFrameDiv = $("d" + cspr.Guid);
            Element.remove(iFrame);
            Element.remove(iFrameDiv);
            CMinder.Utility.hideWaitDialog();
            
        } 
    },
    toDollarsAndCents: function(n) {
		var s= "" + Math.round(n * 100)/100;
		var i = s.indexOf('.');
		if (i < 0) return s + ".00";
		var t = s.substring(0, i+1) + s.substring(i + 1, i + 3);
		if (i + 2 == s.length) t += "0";
	    return t;
    },
    IsDigit: function(num) {
	    if (num.length>1){return false;}
	    var string="1234567890";
	    if (string.indexOf(num)!=-1){return true;}
	    return false;
	},
	GetElementPosition: function(obj) {
	    var curleft = curtop = 0;
	    if (obj.offsetParent) {
		    curleft = obj.offsetLeft
		    curtop = obj.offsetTop
		    while (obj = obj.offsetParent) {
			    curleft += obj.offsetLeft
			    curtop += obj.offsetTop
		    }
	    }
	    return [curleft,curtop];
    },
    isValidEmail: function(email, required) {
        if (required==undefined) {   // if not specified, assume it's required
            required=true;
        }
        if (email==null) {
            if (required) {
                return false;
            }
            return true;
        }
        if (email.length==0) {  
            if (required) {
                return false;
            }
            return true;
        }
        if (! CMinder.Utility.allValidChars(email)) {  // check to make sure all characters are valid
            return false;
        }
        if (email.indexOf("@") < 1) { //  must contain @, and it must not be the first character
            return false;
        } else if (email.lastIndexOf(".") <= email.indexOf("@")) {  // last dot must be after the @
            return false;
        } else if (email.indexOf("@") == email.length) {  // @ must not be the last character
            return false;
        } else if (email.indexOf("..") >=0) { // two periods in a row is not valid
	    return false;
        } else if (email.indexOf(".") == email.length) {  // . must not be the last character
	    return false;
        }
        return true;
    },  
    allValidChars: function (email) {
        var parsed = true;
        var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
        for (var i=0; i < email.length; i++) {
            var letter = email.charAt(i).toLowerCase();
            if (validchars.indexOf(letter) != -1)
                continue;
            parsed = false;
            break;
        }
        return parsed;
    },
    isInteger:function (s)
       {
          var i;

          if (s == null || s.length == 0)
          if (isInteger.arguments.length == 1) return 0;
          else return (isInteger.arguments[1] == true);

          for (i = 0; i < s.length; i++)
          {
             var c = s.charAt(i);

             if (!CMinder.Utility.IsDigit(c)) return false;
          }

          return true;
       },
       getFormattedAddress: function(a) {
            var addr = "";
            addr += a.Address1 + "<br/>";
            if (a.Address2 != "")
                addr += a.Address2 + "<br/>";
            addr += a.City
            if (a.State != "")
                addr += ", " + a.State;
            if (a.PostalCode != "")
                addr += " " + a.PostalCode;
            if (a.Country != "US")
                addr += "<br />" + a.Country;
            
            return addr;
       }

}

CMinder.Utility.CommonDataAccessor = CMinder.Module.defineClass({
    name: "CommonDataAccessor",
    construct: function() {
        
    },
    methods: {
        StateArray: [],
        CountryArray: [],
        GetStateAndCountryData: function () {
            CMinder.Ajax.Utility.GetStateAndCountryData(this.getStateAndCountryData_callback, this);
        },
        getStateAndCountryData_callback: function(res) {
            if (res == null) {
                CMinder.alertCancel('The call to the server was unsuccessful.  Your session may have timed out.  Please try logging out and back in again.', $('cmContainer'), 'Server Error');
                return;
            }
            res.context.populateStateArray(res.value.getValue('StateArray'), res.context);
            res.context.populateCountryArray(res.value.getValue('CountryArray'), res.context);
            res.context.onStateAndCountryDataReady.fire();
        },
        onStateAndCountryDataReady: new YAHOO.util.CustomEvent("StateAndCountryDataReady"),
        populateStateArray: function(data, me) {
            $A(data).each(function(s) {
                me.StateArray[me.StateArray.length++] = new CMinder.State(s.Code, s.Name);
            });
        },
        populateCountryArray: function(data, me) {
            $A(data).each(function(c) {
                me.CountryArray[me.CountryArray.length++] = new CMinder.Country(c.Code, c.Name);
            });
            //alert (me.CountryArray);
        }
    }
});
CMinder.Address = CMinder.Module.defineClass({
    name: "Address",
    construct: function(data) {
        this.Address1 = data.AddressLine1;
        this.Address2 = data.AddressLine2;
        this.City = data.City;
        this.State = data.StateProvidence;
        this.PostalCode = data.PostalCode;
        this.Country = data.Country;
    },
    methods: {
        toString: function() {
            
        }
    }
});

CMinder.State = CMinder.Module.defineClass({
    name: "State",
    construct: function(code, name) {
        this.Code = code;
        this.Name = name;
    }
});


CMinder.Country = CMinder.Module.defineClass({
    name: "Country",
    construct: function(code, name) {
        this.Code = code;
        this.Name = name;
    }
});

var BrowserDetect = {
    // REF: http://www.quirksmode.org/js/detect.html
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();CMinder.Utility.populateQueryString();