// Some Variables

var message_box_fade_timeout_id = -1;


function validate_form(form_id){
    valmessage = '';
    masterform = $(form_id);
    for(ff=0; ff<masterform.elements.length; ff++)
    {
        currelem = masterform.elements[ff];
        switch(currelem.type)
        {
            case 'select' :
            case 'select-one' :
                tmp = validateTypes(currelem, currelem.options[currelem.selectedIndex].value);
                if(tmp)
                {
                    valmessage = valmessage + tmp+"\n";
                }
            break;
            case 'text':
                tmp = validateTypes(currelem, currelem.value);
                if(tmp)
                {
                    valmessage = valmessage + tmp+"\n";
                }
            break;
            case 'password':
                tmp = validateTypes(currelem, currelem.value);
                if(tmp)
                {
                    valmessage = valmessage + tmp+"\n";
                }
            break;
        }

    }
    if(valmessage!="")
    {
        alert("Please complete the below fields\n\n"+valmessage);
        return false;
    } else {
        return true;
    }
}

function validateTypes(fieldObj, theValue)
{
    if (!fieldObj.attributes['validate']) {  return false; }
    if(fieldObj.attributes['validate'].value)
    {
        vTypes = fieldObj.attributes['validate'].value.split('|');
    } else {
        return false;
    }
    if(vTypes.length == 1)
    {
        return false;
    }
    errors=0;

    for(vt=1; vt<vTypes.length; vt++)
    {
        realTypes = vTypes[vt].split(':');
        switch(realTypes[0])
        {
            case 'OPTIONAL':
                if(theValue == "")
                {
                    return false;
                }
            break;
            case 'NUM':
                if(!theValue.match(/\b\d+\b/))
                {
                    errors++;
                }
            break;
            case 'LENGTH':
                if(theValue.length != parseInt(realTypes[1]))
                {
                    errors++;
                }
            break;
            case 'MAXLENGTH':
                if(theValue.length > parseInt(realTypes[1]))
                {
                    errors++;
                }
            break;
            case 'MINLENGTH':
                if(theValue.length < parseInt(realTypes[1]))
                {
                    errors++;
                }
            break;
            case 'SAMEAS':
                if(theValue != $(realTypes[1]).value)
                {
                    errors++;
                }
            break;
            case 'GREATERTHAN':
                if(!(theValue > $(realTypes[1]).value))
                {
                    errors++;
                }
            break;
            case 'EMAIL':
                if (!theValue.match(/\b[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b/i))
                {
                    errors++;
                }
            break;
            case 'NOTEMPTY':
                if(theValue == "")
                {
                    errors++;
                }
            break;
            case 'POSITIVE':
                if(parseInt(theValue) < 0)
                {
                    errors++;
                }
            break;
            default:
                //alert( vTypes[vt] + 'not recognized');
            break;
        }
    }
    if(errors > 0)
    {
        return 	"- "+vTypes[0];
    }
}

function crud(action_name, class_name, id_object ,post_perameters, after_success)
{
  new Ajax.Request('http://www.hothousemedia.com/mm/global_includes/scripts/crud.php?class='+class_name+'&action='+action_name+"&id="+id_object,
  {
        method: 'post',
        parameters: post_perameters,
    onSuccess: function(response){
            var perameter_array = new Array();
            if (after_success != "")
            {
                eval(after_success);
            } else {
                if (post_perameters.indexOf("&") > 0)
                {
                    perameter_array = post_perameters.split("&");
                } else {
                    perameter_array[0] = post_perameters;
                }
                for (var x = 0; x < perameter_array.size(); x++)
                {
                    sub_array = perameter_array[x].split("=");
                    if($(sub_array[0]))
                    {
                        $(sub_array[0]).value = sub_array[1];
                        $(sub_array[0]).innerHTML = sub_array[1];
                    } else if (id_object+"_"+$(sub_array[0])) {
                        $(id_object+"_"+sub_array[0]).value = sub_array[1];
                        $(id_object+"_"+sub_array[0]).innerHTML = sub_array[1];
                    }
                }
            }
    },
        onFailure: function()
            {
                alert('Error in CRUD.');
            }
  });
}


// fills the centre div with a page of content and makes it appear
function populate_div(url_string, parameters)
{

    new Ajax.Updater('centerDiv', url_string, {
        method: 'post',
        parameters: parameters,
        evalScripts: true,
        onFailure: function ()
        {
            alert('Error Encountered.');
        },
        onSuccess: function ()
        {
            rePos();
            $('centerDiv').style.display = "block";
        }
    }
    );
}
// hides the center div
function hide_center_div()
{
    $('centerDiv').style.display = "none";
}

// fills a element.innerHTML with a page
function _populate(element_id, url_string, parameters, after_success, after_failure)
{
     new Ajax.Updater(element_id, url_string, {
        method: 'post',
        parameters: parameters,
        evalScripts: true,
        onFailure: function ()
            {
                alert("Error encountered.");
                eval(after_failure);
            },
        onSuccess: function ()
            {
                eval(after_success);
            }
        }
    );
}

// populates the message box with message content
// then fades the colour
function message(message_content)
{
    // if the message_box element exists we use it, if not we just alert the text
    if ($('message_box'))
    {
        clearTimeout(message_box_fade_timeout_id);
        $('message_box').morph("background:#FFF9D7 none repeat scroll 0%;border:1px solid #E2C822;");
        $('message_box').style.display = "none";
        $('message_box').innerHTML = message_content;
        setTimeout ( "Effect.Appear('message_box');", 500 );
        Effect.Appear('message_box');
        message_box_fade_timeout_id = setTimeout ( "$('message_box').morph('background:#F0F0FA none repeat scroll 0%;border:1px solid #CCCCCC;')", 3000 );
    } else {
        alert(message_content);
    }
}
// same as message_box - but for a second message box
function message_2(message_content)
{
    // if the message_box element exists we use it, if not we just alert the text
    if ($('message_box_2'))
    {
//		if (message_box_fade_timeout_id_2) { clearTimeout(message_box_fade_timeout_id_2); }
        $('message_box_2').morph("background:#FFF9D7 none repeat scroll 0%;border:1px solid #E2C822;");
        $('message_box_2').style.display = "none";
        $('message_box_2').innerHTML = message_content;
        setTimeout ( "Effect.Appear('message_box_2');", 500 );
        Effect.Appear('message_box_2');
//		message_box_fade_timeout_id_2 = setTimeout ( "$('message_box_2').morph('background:#F0F0FA none repeat scroll 0%;border:1px solid #CCCCCC;')", 3000 );
    } else {
        alert(message_content);
    }
}

function getScrollY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
//  return [ scrOfX, scrOfY ];
        return scrOfY;
}
function getScrollX() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
//  return [ scrOfX, scrOfY ];
        return scrOfX;
}

// makes an ajax request
function ajax_request(url, parameters, after_success)
{
    new Ajax.Request(url, {
        method: 'post',
        parameters: parameters,
        onSuccess: function (response)
            {
                resp = response.responseText;
                resp_array = resp.split("|");
                resp_code = resp_array[0];
                resp_text = resp_array[1];
                if (!resp_text) { resp_text = "Error Encountered: no resp text"; }
                eval(after_success);
            },
        onFailure: function()
            {
                alert('Ajax Request Failed.');
            }
        }
    );
    return true;
}

// submits a form via ajax
function submit_form(form_id,success_action)
{
    if (!$(form_id)) { alert('Form: '+form_id+' does not exist'); return false; }
    // validate the form, if it fails dont go further
    if (!validate_form(form_id)) { return false; }

    // now that we know that the form submission is valid

    parameters = "";

    elements = $(form_id).elements
    for(var i = 0; i < elements.length; i++)
    {
        type = elements[i].type;
        name = elements[i].name;
        value = elements[i].value;
        if (type == "button")
        {
            // do nothing
        } else if (type == "checkbox"){
            if (elements[i].checked)
            {
                if (parameters == "")
                {
                    parameters = name+"="+value;
                } else {
                    parameters = parameters + "&"+name+"="+value;
                }
            }
        } else {
            if (parameters == "")
            {
                parameters = name+"="+value;
            } else {
                parameters = parameters + "&"+name+"="+value;
            }
        }

    }
    new Ajax.Request($(form_id).action, {
        method: 'post',
        parameters: parameters,
        onSuccess: function (response)
            {
                // we set up some response values - the full response, and the code and text part (if they exist)
                resp = response.responseText;
                resp_array = resp.split("|");
                resp_code = resp_array[0];
                resp_text = resp_array[1];
                if (!resp_text) { resp_text = "Error Encountered: no resp text"; }
                eval(success_action);

            },
        onFailure: function()
            {
                alert('Form Submission Failed\nForm ID:'+$(form_id).id+'\nForm Action:'+$(form_id).action);
            }
        }
    );
    return true;
}
// unhides an element that has display:none
function unhide(element_id)
{
    $(element_id).style.display="block";
}

// cancels the propagation of javascript events
// need to make this function properly cross browser
function stopPropagation(evt)
{
    evt.stopPropagation();
//	evt.cancelBubble = true; // IE
}

// function called from an onkeypress - if the event was the ENTER key then the evalcode will be run
// to use this add the following to an input field in any form: onKeyPress="return submitenter('alert(resp)',event)"
function on_enter(evalcode,e)
{
    var keycode;
    if (window.event) keycode = window.event.keyCode;
    else if (e) keycode = e.which;
    else return true;

    if (keycode == 13)
  {
    eval(evalcode);
    return false;
  } else {
    return true;
    }
}
// sets the focus on first element in the first form on the page
// usually called from the body tag: onload="first_element_focus()"
function first_element_focus()
{
    if (document.forms[0] && document.forms[0].elements[0])
    {
        document.forms[0].elements[0].focus()
    }
    return true;
}
// slides an element up or down based on its style.display
function toggle_slide(element_id)
{
    if ($(element_id).style.display == "none")
    {
        Effect.SlideDown(element_id,{duration:0.3});
    } else {
        Effect.SlideUp(element_id,{duration:0.3});
    }
}
// flips an elements baground colour between the two parameters
function toggle_bg_color(element, colour1, colour2)
{
    current_bg_colour = element.style.backgroundColor;
    if (current_bg_colour.compareColor(colour1) || current_bg_colour == "")
    {
        element.style.backgroundColor = colour2;
    } else {
        element.style.backgroundColor = colour1;
    }
}

// two new functions below can be applied to colours to compare them
// the first function makes use of the second function.  Currently this function is used
// by the toggle_bg_colour function to switch an element between two background colours
String.prototype.compareColor = function(){
    if((this.indexOf("#") != -1 && arguments[0].indexOf("#") != -1) ||
      (this.indexOf("rgb") != -1 && arguments[0].indexOf("rgb") != -1)){
      return this.toLowerCase() == arguments[0].toLowerCase()
    }
    else{
      xCol_1 = this;
      xCol_2 = arguments[0];
      if(xCol_1.indexOf("#") != -1)xCol_1 = xCol_1.toRGBcolor();
      if(xCol_2.indexOf("#") != -1)xCol_2 = xCol_2.toRGBcolor();
      return xCol_1.toLowerCase() == xCol_2.toLowerCase()
    }
  }


  String.prototype.toRGBcolor = function(){
    varR = parseInt(this.substring(1,3), 16);
    varG = parseInt(this.substring(3,5), 16);
    varB = parseInt(this.substring(5,7), 16);
    return "rgb(" + varR + ", " + varG + ", " +  varB + ")";
  }
  // returns an array of the width and height
function get_page_size() {

         var xScroll, yScroll;

        if (window.innerHeight && window.scrollMaxY) {
            xScroll = window.innerWidth + window.scrollMaxX;
            yScroll = window.innerHeight + window.scrollMaxY;
        } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
            xScroll = document.body.scrollWidth;
            yScroll = document.body.scrollHeight;
        } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
            xScroll = document.body.offsetWidth;
            yScroll = document.body.offsetHeight;
        }

        var windowWidth, windowHeight;

        if (self.innerHeight) {	// all except Explorer
            if(document.documentElement.clientWidth){
                windowWidth = document.documentElement.clientWidth;
            } else {
                windowWidth = self.innerWidth;
            }
            windowHeight = self.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
            windowWidth = document.documentElement.clientWidth;
            windowHeight = document.documentElement.clientHeight;
        } else if (document.body) { // other Explorers
            windowWidth = document.body.clientWidth;
            windowHeight = document.body.clientHeight;
        }

        // for small pages with total height less then height of the viewport
        if(yScroll < windowHeight){
            pageHeight = windowHeight;
        } else {
            pageHeight = yScroll;
        }

        // for small pages with total width less then width of the viewport
        if(xScroll < windowWidth){
            pageWidth = xScroll;
        } else {
            pageWidth = windowWidth;
        }

        return [pageWidth,pageHeight];
    }

