Utils = new ( Class.create({
    
    initialize : function()
    {
    },
    
    CenterScreen : function(element)
    {
        var scrollOffsets = document.viewport.getScrollOffsets();
        var viewportHeight = document.viewport.getHeight();
        var viewportWidth = document.viewport.getWidth();
        var elementHeight = element.getHeight();
        var elementWidth = element.getWidth();
        
        element.setStyle({
            top: viewportHeight / 2 - elementHeight / 2 + scrollOffsets.top + "px",
            left: viewportWidth / 2 - elementWidth / 2 + scrollOffsets.left + "px"
          });
    },
    
    GetUploadForm : function(action, uploadText)
    {
        var form = new Element("form");
        form.id = "uploadForm";
        form.action = action;
        form.method = "post";
        form.enctype = "multipart/form-data";
        var input = new Element("input");
        input.name = "uploadFile";        
        input.id = "uploadFile";
        input.type = "file";
        input.size = 35;
        form.insert(input);
        var button = new Element("input");
        button.id = "uploadButton";
        button.type = "submit";
        button.value = uploadText;
        form.insert(button);
        return form;
    },
    
    IsDateEqual : function(date1, date2)
    {
        return  date1.getFullYear() == date2.getFullYear()
                && date1.getMonth() == date2.getMonth()
                && date1.getDate() == date2.getDate();
    },
    
    IsValidString : function(originalString, filter)
    {
        switch(filter)
        {
            case "Email" :
                if( originalString.indexOf("@") != -1 &&
                    originalString.indexOf("@") == originalString.lastIndexOf("@") &&
                    originalString.indexOf(".") != -1 &&
                    originalString.length >= 5 ) return true;
                return false;
            
            case "NotNullOrEmpty" :
                if(originalString == null || originalString == "") return false;
                return true;
            
            case "Number" :
                var anum = /(^\d+$)|(^\d+\.\d+$)/
                if(anum.test(originalString)) return true;
                return false;
            
            case "URL" :
                var hasDot = false;
                var charCount = 0;
                var hasSlash = false;
                for(i = 0; i < originalString.length && !hasSlash; i++)
                {
                    if(originalString.charAt(i) == '.')
                    {
                        if(!hasDot && charCount == 0) return false;
                        if(hasDot && charCount < 2) return false;
                        charCount = 0;
                        hasDot = true;
                    }
                    else
                    {
                        charCount++;
                    }
                    
                    if(originalString.charAt(i) == '/')
                    {
                        if(hasDot) hasSlash = true;
                    }
                    
                }
                
                if(!hasDot) return false;
                if(hasDot && charCount < 2) return false;
                
                return true;
        }
        return false;
    },
    
    ConvertToTwoDigits : function(number)
    {
        if(number < 10) return "0" + number;
        else return number;
    },
    
    StripSlashes : function(s)
    {
        str = s.replace(/\\'/g,'\'');
        str = str.replace(/\\"/g,'"');
        str = str.replace(/\\\\/g,'\\');
        str = str.replace(/\\0/g,'\0');
        return str;
    },
    
    BR2NL : function(s)
    {
        if( typeof(s) == "string" ) return s.replace(/<br \/>/g,"\n");
        else return s;
    },
    
    AddSpaces : function(nStr)
    {
        nStr += '';
        nStr = this.RemoveSpaces(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;
    },
    
    RemoveSpaces : function(nStr)
    {
        return nStr.gsub(" ", "");
    },
    
    GetTimeStamp : function(date)
    {
        return date.getTime() / 1000;
    },
    
    GetFormattedDate : function(timestamp)
    {
        if(timestamp == 0) return "";
        var tempDate = new Date(timestamp * 1000);
        var formattedDateString = tempDate.getFullYear() + "."
            formattedDateString += this.ConvertToTwoDigits(tempDate.getMonth() + 1) + "."
            formattedDateString += this.ConvertToTwoDigits(tempDate.getDate());
        return formattedDateString;
    },
    
    GetFormattedTime : function(timestamp)
    {
        if(timestamp == 0) return "";
        var tempDate = new Date(timestamp * 1000);
        var formattedString = this.ConvertToTwoDigits(tempDate.getHours()) + ":";
            formattedString += this.ConvertToTwoDigits(tempDate.getMinutes()) + ":";
            formattedString += this.ConvertToTwoDigits(tempDate.getSeconds());
        return formattedString;
    },
    
    GetFormattedDateTime : function(timestamp)
    {
        return this.GetFormattedDate(timestamp) + " - " + this.GetFormattedTime(timestamp);
    },
    
    ReplaceWithDateTimeInput : function(originalElement, isTimeDisplayed)
    {
        var thisClass = this;
        
        var left = originalElement.viewportOffset().left;
        var top = originalElement.viewportOffset().top;
        
        var width = originalElement.getWidth();
        var inputWidth = null;
        if(isTimeDisplayed) inputWidth = originalElement.getWidth() / 2 - 46 - 20;
        else inputWidth = originalElement.getWidth() - 45 - 10;
        var height = originalElement.getHeight();
        originalElement.hide();
        
        var dateInput = new Element("input");
        dateInput.id = originalElement.id + "date";
        dateInput.readOnly = true;
        dateInput.setStyle({float: "left", width: inputWidth + "px" });
        dateInput.value = this.GetFormattedDate(originalElement.value);
        
        var datePickerImg = new Element("img");
        datePickerImg.id = originalElement.id + "dateImg";
        datePickerImg.src = "Themes/DefaultImages/datePicker.png";
        datePickerImg.setStyle({float: "left", marginTop: "4px", marginLeft: "6px"});
        
        var datePickerDeleteImg = new Element("img");
        datePickerDeleteImg.id = originalElement.id + "dateDeleteImg";
        datePickerDeleteImg.src = "Themes/DefaultImages/pickerDelete.png";
        datePickerDeleteImg.setStyle({float: "left", marginTop: "4px", marginLeft: "6px"});
        
        if(isTimeDisplayed)
        {
            var timeInput = new Element("input");
            timeInput.id = originalElement.id + "time";
            timeInput.readOnly = true;
            timeInput.setStyle({float: "right", width: inputWidth + "px" });
            timeInput.value = this.GetFormattedTime(originalElement.value);
            
            var timePickerImg = new Element("img");
            timePickerImg.id = originalElement.id + "timeImg";
            timePickerImg.src = "Themes/DefaultImages/timePicker.png";
            timePickerImg.setStyle({float: "right", marginTop: "4px", marginLeft: "6px"});
            
            var timePickerDeleteImg = new Element("img");
            timePickerDeleteImg.id = originalElement.id + "timeDeleteImg";
            timePickerDeleteImg.src = "Themes/DefaultImages/pickerDelete.png";
            timePickerDeleteImg.setStyle({float: "right", marginTop: "4px", marginLeft: "6px"});
        }
        
        var resultDIV = new Element("div");
        resultDIV.setStyle({float: "left", padding: "0px", margin: "0px", width: width + "px", height: height + "px" });
        resultDIV.insert(dateInput); resultDIV.insert(datePickerDeleteImg); resultDIV.insert(datePickerImg);
        if(isTimeDisplayed) { resultDIV.insert(timePickerImg); resultDIV.insert(timePickerDeleteImg); resultDIV.insert(timeInput); }
        
        Element.insert(originalElement, { before: resultDIV });
        
        var datePicker = new DatePicker({
            container: "datePicker",
            DayClickAction: function(clickedDate)
            {
                var currentDate = new Date(originalElement.value * 1000);
                currentDate.setYear(clickedDate.getFullYear());
                currentDate.setMonth(clickedDate.getMonth());
                currentDate.setDate(clickedDate.getDate());
                
                var timestamp = currentDate.getTime() / 1000;
                originalElement.value = timestamp;
                dateInput.value = thisClass.GetFormattedDate(timestamp);
            }
        });
        
        // Events
        Event.observe(originalElement.id + "dateImg", "click", function(event)
        {
            if(originalElement.value != 0)
            {
                datePicker.currentDate = new Date(originalElement.value * 1000);
                datePicker.selectedDate = datePicker.currentDate;
            }
            else
            {
                datePicker.currentDate = new Date();
                datePicker.selectedDate = datePicker.currentDate;
            }
            
            datePicker.config.left = Event.pointerX(event) + 5;
            datePicker.config.top = Event.pointerY(event) - 5;
            datePicker.Show();
            $("datePicker").setStyle({display: "block"});
        });
        
        Event.observe(originalElement.id + "dateDeleteImg", "click", function(event)
        {
            originalElement.value = 0;
            dateInput.value = thisClass.GetFormattedDate(0);
        });
        
        if(isTimeDisplayed)
        {
            var timePicker = new TimePicker({
                container: "timePicker",
                HourAndMinuteSelectedAction: function(clickedHour, clickedMinute)
                {
                    var currentDate = new Date(originalElement.value * 1000);
                    currentDate.setHours(clickedHour);
                    currentDate.setMinutes(clickedMinute);
                    
                    var timestamp = currentDate.getTime() / 1000;
                    originalElement.value = timestamp;
                    timeInput.value = thisClass.GetFormattedTime(timestamp);
                }
            });
            
            // Events
            Event.observe(originalElement.id + "timeImg", "click", function(event)
            {
                if(originalElement.value != 0)
                {
                    var currentDate = new Date(originalElement.value * 1000);
                    timePicker.selectedHour = currentDate.getHours();
                    timePicker.selectedMinute = currentDate.getMinutes();
                }
                
                timePicker.config.left = Event.pointerX(event) + 5;
                timePicker.config.top = Event.pointerY(event) - 5;
                timePicker.Show();
                $("timePicker").setStyle({display: "block"});
            });
            
            Event.observe(originalElement.id + "timeDeleteImg", "click", function(event)
            {
                if(originalElement.value > 0)
                {
                    var currentDate = new Date(originalElement.value * 1000);
                    currentDate.setHours(0);
                    currentDate.setMinutes(0);
                    currentDate.setSeconds(0);
                    
                    var timestamp = currentDate.getTime() / 1000;
                    originalElement.value = timestamp;
                    timeInput.value = thisClass.GetFormattedTime(0);
                }
                else
                {
                    timeInput.value = thisClass.GetFormattedTime(0);
                }
            });
        }
    }
    
}))();
