/* $Id: common.js,v 1.4 2010/07/16 13:26:47 cmsbuild Exp $ */
/**
 * Atlas Ergonomics Web Application
 * Copyright 2006 - 2010 Atlas Ergonomics. All Rights Reserved.
 */ 

function MM_findObj(n, d) { //v4.01
	var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
	if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
	if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_preloadImages() { //v3.0
	var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
	var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
	if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function showDate(yearOnly){
	var mydate=new Date();
	var year=mydate.getYear();
	if (year < 1000){year+=1900};
	var day=mydate.getDay();
	var month=mydate.getMonth();
	var daym=mydate.getDate();
	var dayEnd = "th";
	if (daym == 1 || daym == 21 || daym == 31){dayEnd = "st";}
	if (daym == 2 || daym == 22){dayEnd = "nd";}
	if (daym == 3 || daym == 23){dayEnd = "rd";}
	var dayarray=new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
	var montharray=new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	if(yearOnly){
		document.write(year);
	}
	else{
	document.write(dayarray[day]+", "+montharray[month]+" "+daym+dayEnd+", "+year);
	}
}

function fixFlashInIE(){
	objects = document.getElementsByTagName("object");
	for (var i = 0; i < objects.length; i++){
		objects[i].outerHTML = objects[i].outerHTML;
	}
}

function log(content) {
    if (window.console !== undefined) {
        console.log(content);
    }
}

///////////////////////////////////////////////////////////////////////////////
// http://www.codedigest.com/CodeDigest/75-String-ReplaceAll-function-in-JavaScript.aspx
String.prototype.replaceAll = function (stringToFind, stringToReplace) {
    var temp = this;
    var index = temp.indexOf(stringToFind);
    while (index != -1) {
        temp = temp.replace(stringToFind, stringToReplace);
        index = temp.indexOf(stringToFind);
    }
    return temp;
}
///////////////////////////////////////////////////////////////////////////////

//Get Array from serialized hidden field
function getSerializedArray(hiddenFieldSelectorId) {
    var raw = $('#' + hiddenFieldSelectorId).val();
    var array = [];

    if (raw != undefined && raw != "") {
        array = JSON.parse(raw);
    }
    else {
        array = new Array();
    }

    return array;
}

function displayNoDataRow(element, emptyCount) {
    //Get the containing table; if no items exist in the body, hide the no data label
    var containingTable = $(element).closest('table');

    if ($(containingTable).find('tbody>tr').length == emptyCount) {
        $(element).show();
    }
    else {
        $(element).hide();
    }
}

//Get a querystring parameter by name
function getParameterByName(name, caseSensitive) {
    if (caseSensitive == undefined) {
        caseSensitive = false;
    }

    var location = !caseSensitive ? window.location.href.toLowerCase() : window.location.href;
    var name = !caseSensitive ? name.toLowerCase() : name;

    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(location);
    if (results == null)
        return "";
    else
        return decodeURIComponent(results[1].replace(/\+/g, " "));
}

//For 'listeningElementId', bind enter key press to click event of 'buttonId'
function bindButtonClickToEnterPress(listeningElementId, buttonId) {
    $('#' + listeningElementId).bind('keypress', function (e) {
        if (e.which == 13) {
            $('#' + buttonId).click();
        }
    });
}

//Determine if file is a video file
function isVideoFile(ext) {
    if (ext != null && ext != undefined) {
        //Video extensions are lowercase in config
        ext = ext.toLowerCase();
    }

    var isVideo = false;

    $(videoFileExtensions.split(',')).each(function (index, value) {
        isVideo = isVideo || ext.match(value) != null;
    });

    return isVideo;
}

//Remove item from serialized array
function removeItem(hiddenFieldId, matchFunc) {
    var array = getSerializedArray(hiddenFieldId);

    if (array != null && array != undefined) {
        for (var i = 0; i < array.length; i++) {
            if (matchFunc(array[i])) {
                array.splice(i, 1);
            }
        }
    }

    //Save back to hidden field
    $('#' + hiddenFieldId).val(JSON.stringify(array));
}

function clearDocumentTable(tableSelector, startIndex) {
    if (startIndex == undefined) {
        startIndex = 1;
    }
    
    $.validity.clear(); //Clear error messages

    var rows;

    if (tableSelector == undefined) {
        rows = $('#dgTaskDocuments tr');
    }
    else {
        rows = tableSelector;
    }

    for (var i = startIndex; i < rows.length; i++) $(rows[i]).remove();

    $('#txtTaskDescription').val('');
}

//Generic method to get item from array based on match function
function getItemFromArray(array, matchFunc) {
    if (array != null && array != undefined) {
        for (var i = 0; i < array.length; i++) {
            if (matchFunc(array[i], i)) {
                return array[i];
            }
        }
    }

    return null;
}

//Update an item within a serialized array
function updateItem(hiddenFieldId, updateFunc) {
    var array = getSerializedArray(hiddenFieldId);

    if (array != null && array != undefined) {
        for (var i = 0; i < array.length; i++) {
            updateFunc(array[i]);
        }
    }

    //Save back to hidden field
    $('#' + hiddenFieldId).val(JSON.stringify(array));
}

//Get an item from a serialized array
function getItemFromSerilaizedArray(hiddenFieldId, matchFunc) {
    var array = getSerializedArray(hiddenFieldId);

    if (array != null && array != undefined) {
        for (var i = 0; i < array.length; i++) {
            updateFunc(array[i]);
        }
    }

    //Save back to hidden field
    $('#' + hiddenFieldId).val(JSON.stringify(array));
}

//Add item from serilzed array
function addItem(item, hiddenFieldId) {
    var array = getSerializedArray(hiddenFieldId);

    array.push(item);

    //Save back to hidden field
    $('#' + hiddenFieldId).val(JSON.stringify(array));
}

function getUniqueId() {
    return new Date().getTime().toString();
}

/*Called after drag drop, rawOrder contains order data to be parsed
tableId[]=rowId1&tableId[]=rowId2&tableId[]=rowId3
*/
function setNewSortOrder(rawOrder, hiddenFieldId, assignmentFunction) {
    var allItems = rawOrder.split('&');

    var existingOptionLookup = getItemLookup(hiddenFieldId, assignmentFunction);

    var arrayToSave = new Array();

    //Go through each of the items in the table and reassign list object sort order properties
    $.each(allItems, function (index, value) {
        if (index == 0) return; //First element is dragdrop table id + []
        if (value.indexOf('_') != -1) {
            var rowId = value.split('_');
            var itemId = rowId[rowId.length - 1];

            if (existingOptionLookup[itemId] != undefined) {
                //Save to array to json serialize to server
                arrayToSave.push(existingOptionLookup[itemId]);

                if (existingOptionLookup[itemId].SortOrder != undefined) { //TODO: remove this if statement and add function call
                    //Set new sort order
                    existingOptionLookup[itemId].SortOrder = index;
                }
                else {
                    existingOptionLookup[itemId].display_order = index;
                }
            }
        }
    });

    //Save back to hidden field to save on server
    $('#' + hiddenFieldId).val(JSON.stringify(arrayToSave));
}

/*Get a generic lookup hashtable - pass in assignment function to assign each item to dictionary.
This is useful when values in hashtable need to be populatedby any property of an item in an array*/
function getItemLookup(hiddenFieldSelectorId, assignmentFunction) {
    var raw = $('#' + hiddenFieldSelectorId).val();
    var lookup = new Object();

    if (raw != undefined && raw != "") {
        var array = JSON.parse(raw);

        for (var i = 0; i < array.length; i++) {
            assignmentFunction(lookup, array[i]);
        }
    }

    return lookup;
}

//Clear all inputs or dropdown lists in a tr. This function does not disable checkbox inputs
function disableRow(chk) {
    var checked = $(chk).is(':checked');

    var row = $(chk).closest('tr');

    $(row).find('input').each(function (index, value) {
        if (value != chk && !$(value).parent().hasClass('row-toggle')) {
            if (checked) {
                $(value).val('');

                //Clear and disable each input
                $(value).attr('disabled', 'true');
            }
            else {
                //Clear and disable each input
                $(value).removeAttr('disabled');
            }
        }
    });

    $(row).find('select').each(function (index, value) {
        if (checked) {
            $(value).val('');

            //Clear and disable each input
            $(value).attr('disabled', 'true');
        }
        else {
            //Clear and disable each input
            $(value).removeAttr('disabled');
        }
    });
}

/*Disable / endable element based on value of radiobutton.*/
function disableElementInTableRow(inputContainer, toggledElementClass) {
    var parentRow = $(inputContainer).closest('tr');
    var input = $(parentRow).find('input:checked');

    if (parentRow != null && parentRow != undefined) {
        parentRow.find('.' + toggledElementClass).each(function (index, elementToDisable) {
            if ($(input).val() == "1") { //'Yes' button selected
                $(elementToDisable).enable();
            }
            else {
                $(elementToDisable).disable();
            }
        });
    }
}

function disableElementTypeInTableRow(trigger, toggledElementType) {
    var checked = $(trigger).is(':checked');

    var parentRow = $(trigger).closest('tr');
    $(parentRow).find(toggledElementType).each(function (index, value) {
        if ($.data(value) != $.data(trigger)) {
            if (checked) {
                $(value).removeAttr('disabled');

                if (index == 1) {
                    //Check first item
                    $(value).attr('checked', 'checked');
                }
            }
            else {
                $(value).attr('disabled', true);
                $(value).removeAttr('checked');
            }
        }
    });
}

//Disable all elements in container element
function toggleAllElementsInContainer(trigger, container, elementTypeToDisable, elementTypeToEnable, checkFirstItemWhenEnabled) {
    if (checkFirstItemWhenEnabled == undefined) {
        checkFirstItemWhenEnabled = true;
    }
    
    var checked = $(trigger).is(':checked');

    $(container).find(checked ? elementTypeToDisable : elementTypeToEnable).each(function (index, value) {
        if ($.data(value) != $.data(trigger)) {
            if (checked) {
                $(value).attr('disabled', true);
                $(value).removeAttr('checked');
            }
            else {
                $(value).removeAttr('disabled');

                if (checkFirstItemWhenEnabled) {
                    $(value).attr('checked', 'checked');
                }
            }
        }
    });
}

//Hide elements if input of value '1' is checked (used with asp.net radiobutton lists)
function hideElements(inputContainer, toggledElementClass) {
    var parentRow = $(inputContainer).closest('tr');
    var input = $(parentRow).find('input:checked');

    if (parentRow != null && parentRow != undefined) {
        $('.' + toggledElementClass).each(function (index, elementToDisable) {
            if ($(input).val() == "1") { //'Yes' button selected
                $(elementToDisable).show();
            }
            else {
                $(elementToDisable).hide();
            }
        });
    }
}

//Validate required data
function validateSingleInput(input) {
    $.validity.start();

    $(input).require();

    return $.validity.end();
}
