// create the prototype on the String object to enable trim
String.prototype.trim = function() {
	// skip leading and trailing whitespace
	// and return everything in between
	var x=this;
	x=x.replace(/^\s*(.*)/, "$1");
	x=x.replace(/(.*?)\s*$/, "$1");
	return x;
}

//ajax edit form functions

function ajaxFormInputName(formName, keyName){
    return "#" + formName + " input[name='" + keyName + "']";
}

function ajaxFormprepare(formName, targetName, keyName){

    ajaxFormprepareV2(formName, targetName, keyName, ajaxFormPreSubmit, ajaxFormPostSubmit);

}

function ajaxFormprepareV2(formName, targetName, keyName, preSubmit, postSubmit){

    //alert("ajaxFormprepare(" + formName + ", " + targetName + ", " + keyName + ");");

    var targetElementName = '#' + targetName;
    if(checkElementValid(targetElementName, false) != 1)
    {
        return;
    }

    var targetformName = '#' + formName;
    if(checkElementValid(targetformName, false) != 1)
    {
        return;
    }

    var targetKeyName = ajaxFormInputName(formName, keyName);
    if(checkElementValid(targetKeyName, false) != 1)
    {
        return;
    }
    
    var deleteButtonName = targetformName + "_deleteButton";
    if(checkElementValid(deleteButtonName, true) != 1)
    {
        deleteButtonName = "NOT_FOUND";
    }

    var saveButtonName = targetformName + "_saveButton";
    if(checkElementValid(saveButtonName, true) != 1)
    {
        saveButtonName = "NOT_FOUND";
    }

    var cloneButtonName = targetformName + "_cloneButton";
    if(checkElementValid(cloneButtonName, true) != 1)
    {
        //alert("WARNING ::" + cloneButtonName + "NOT found");
        cloneButtonName = "NOT_FOUND";
        //return;
    }

    var cmdElementName = "CMD";
    cmdElementName = ajaxFormInputName(formName, cmdElementName);
    if(checkElementValid(cmdElementName, false) != 1)
    {
        return;
    }
    
    var ajaxForm_Options = {
        target: targetElementName,
        beforeSubmit:  preSubmit,  // pre-submit callback 
        success:       postSubmit  // post-submit callback     
        //,url: "/developer/ajaxForm.aspx"
    };

    // bind form using 'ajaxForm' 
    $(targetformName).ajaxForm(ajaxForm_Options);
    
    if(deleteButtonName!="NOT_FOUND"){
        $(deleteButtonName).click(function(){
            ajaxFormDeleteButtonClick(formName, keyName)
        });
    }

    if(saveButtonName != "NOT_FOUND"){
        $(saveButtonName).click(function(){
            ajaxFormSaveButtonClick(formName, keyName)
        });
    }
    if(cloneButtonName!="NOT_FOUND"){
        $(cloneButtonName).click(function(){
            ajaxFormCloneButtonClick(formName, keyName)
        });
    }
}



// pre-submit callback
function ajaxFormPreSubmit(formData, jqForm, options){
    /*
    if (jqForm.valid()) {  //works?
        alert("valid");
        return true;
    }
    else{
        alert("invalid");
        return false;
    }
    */

}

// post-submit callback
function ajaxFormPostSubmit(responseText, statusText){

    //alert("postResponse " + statusText);
    //$('#popupTarget').dialog('close');
    //location.reload(true);
    //RefreshSandboxPageAfterAjaxSave = true;

}

function ajaxFormDeleteButtonClick(strFormName, strKeyName){

    /*
    var keyElementName = ajaxFormInputName(strFormName, strKeyName);
    if(checkElementValid(keyElementName) != 1)
    {
        return;
    }
    */
    if (confirm("Are you sure you want to delete this record?")){
        ajaxFormButtonAction(strFormName, "DELETE", strKeyName, true);
    }
}

function ajaxFormSaveButtonClick(strFormName, strKeyName){

    /*
    var keyElementName = ajaxFormInputName(strFormName, strKeyName);
    if(checkElementValid(keyElementName) != 1)
    {
        return;
    }
    */
    ajaxFormButtonAction(strFormName, "SAVE", strKeyName, true);
}

function ajaxFormCloneButtonClick(strFormName, strKeyName){
    
    var keyElementName = ajaxFormInputName(strFormName, strKeyName);
    $(keyElementName).val("");
    $("#" + strFormName + "_RECORD_STATUS").text("NEW RECORD");
    $("#" + strKeyName + "_display").text("NEW");
    $("#" + strFormName + "_deleteButton").hide();
    $("#" + strFormName + "_cloneButton").hide();
    $("#" + strFormName + "_saveButton").val("CREATE");
}

function ajaxFormButtonAction(strFormName, strCMD, strKeyName, blnPostKey){

    
    strFormName = "#" + strFormName;
    if(checkElementValid(strFormName) != 1)
    {
        return;
    }

    var keyElementName = ajaxFormInputName(strFormName, strKeyName);
    if(checkElementValid(keyElementName) != 1)
    {
        return;
    }
    
    
    if (!blnPostKey) {
            $(keyElementName).val("");
    }

    var cmdElementName = "CMD";
    cmdElementName = ajaxFormInputName(strFormName, cmdElementName);
    if(checkElementValid(cmdElementName) != 1)
    {
        return;
    }

    $(cmdElementName).val(strCMD);

    if ( $(cmdElementName).val() == "SAVE" ){
        //alert($(cmdElementName).val());
        //alert(strFormName + " valid = " + $(strFormName).valid());
        if (!$(strFormName).valid()) {
            return false;
        }
    }
    
    $(strFormName).submit();

}

function checkElementValid(elementName, silent){

    
    var elementCount = $(elementName).length;
    //alert("element[" + elementName + "] apperars [" + $(elementName).length + "] times");

    if(elementCount != 1 && !silent)
    {
        alert("ERROR: element[" + elementName + "] appears [" + $(elementName).length + "] times");
    }
    return elementCount;
}

function editFormCloneButtonClick(strFormName, strKeyName){


    var keyElementName = ajaxFormInputName(strFormName, strKeyName);
    $(keyElementName).val("");
    $("#" + strFormName + "_RECORD_STATUS").text("NEW RECORD");
    $("#" + strKeyName + "_display").text("NEW");
    $("#" + strFormName + "_deleteButton").hide();
    $("#" + strFormName + "_cloneButton").hide();
    $("#" + strFormName + "_saveButton").val("CREATE");



}

function fnAjaxLookupSelect(queryName, matchVal, currentVal, inputId, targetElementId){

    var url = "/ajaxLookUp.aspx";
    url += "?p_queryName=" + queryName;
    url += "&p_matchValue=" + matchVal;
    url += "&p_currentValue=" + currentVal;
    url += "&p_selectName=" + inputId;
    $("#" + targetElementId).load(url);

}


function fnShowSbProcedureControls(strCtrlId){

    $("#" + strCtrlId +"_componentControl").toggle();
    if ( $("#" + strCtrlId +"_componentControl").css("display") == "block" ) {
        $("#" + strCtrlId + "_componentMain").css("border", "1px dashed #333399");
        $("#" + strCtrlId + "_componentMain").css("background-image", "url(/developer/i/cmd_overlay.png)");

    } else {
        $("#" + strCtrlId + "_componentMain").css("border", "none");
        $("#" + strCtrlId + "_componentMain").css("background-image", "");
    }
}


//ajaxStyle functions

function fn_rh_addStyle(stylelist){
    stylelist.replace("\n","");
    var sheetArray=stylelist.split("|");
    for (i=0;i<sheetArray.length;i++){
        var href="";
        href = sheetArray[i];
        if( href != ""){
            if(!fn_rh_styleCheck(href)){
                fn_rh_appendStyleSheet(href)
            }
        }
    }
}
  
function fn_rh_styleCheck(href){
    var sheetExists = false;
    $('link[@rel*=style][href]').each(function(i){
        if(this.getAttribute('href') == href){
            sheetExists = true;
            return false;
        }
    });
    return sheetExists;
}

function fn_rh_appendStyleSheet(sheeturl){
    var browser = fn_rh_getInternetExplorerVersion();
    //alert(sheeturl);
    if (browser == -1) {
        jQuery(document.createElement("link"))
            .attr({type: "text/css",href: sheeturl, rel:"stylesheet"})
            .appendTo("head");
    }
    else{
        $("link[title=temporaryAjaxStyle]").attr("href",sheeturl);
    }
}

function fn_rh_getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

//jtree functions

function initJtree(treeid, elementid, cmdOutputId, contentId, loadContent){

    var date = new Date();
    var tree = $.tree_create();
    var xmlPath = "/developer/tpl/sandbox/COMPONENT_ROOT/sbList/jtree_" + treeid + ".xml?t=" + date.getTime();
    var opt = {
        data: {
            type: "xml_nested", // or "xml_nested" or "json"
            url: xmlPath
        },
        ui: {
            theme_name: "classic" //"themeroller" //"apple"
        },
        rules: {
            draggable: "all"
        },
        lang: {
            new_node: "New Item",
            loading: "Loading ..."
        },
        callback: {

            onrename: function(NODE, LANG, TREE_OBJ, RB) { treeNodeEdit("Rename", NODE.id, TREE_OBJ, treeid, elementid, cmdOutputId, contentId); }, // node renamed ISNEW - TRUE|FALSE, current language
            onmove: function(NODE, REF_NODE, TYPE, TREE_OBJ, RB) { treeNodeEdit("Move", NODE.id, TREE_OBJ, treeid, elementid, cmdOutputId, contentId); }, // move completed (TYPE is BELOW|ABOVE|INSIDE)
            oncreate: function(NODE, REF_NODE, TYPE, TREE_OBJ, RB) { treeNodeEdit("Create", "", TREE_OBJ, treeid, elementid, cmdOutputId, contentId) }, // node created, parent node (TYPE is createat)
            ondelete: function(NODE, TREE_OBJ, RB) { treeNodeEdit("Delete", NODE.id, TREE_OBJ, treeid, elementid, cmdOutputId, contentId) }, // node deleted
            onselect: function(NODE, TREE_OBJ) { navigateDocument(NODE); }

        }

    };
    tree.init($("#" + elementid), opt);
    tree.open_all();
    if(loadContent){
        //alert("Load Content");
        $("#" + contentId).load("jTreeAjaxData.aspx?treeid=" + treeid);
    }
}

function navigateDocument(NODE) {
    var anchor = "node_" + NODE.id + "_link";
    document.location.hash = anchor;
}

function treeNodeEdit(cmd, id, TREE_OBJ, treeid, treeElementid, cmdOutputId, contentId) {


    var xml = TREE_OBJ.getXML({ type: "nested" });
    //alert(cmd + "node id: " + id + " Tree XML : " + xml);

    $.post("/developer/list_xml/jTreeAjaxCmd.aspx",
        {
            nodeCmd: cmd,
            treeId: treeid,
            nodeId: id,
            nodeData: xml
        },
        function(data) {
            $("#" + cmdOutputId).html(data);
            initJtree(treeid, treeElementid, cmdOutputId, contentId, true);

        }
    );

}


//tree v2 functions

function buildTreeXml(cmd, id, tree, treeid){
    var xml = '<tree id="' + treeid + '" cmd="' + cmd + '" cmdNode="' + id + '">';
    xml += tree.getXML({ type: "nested" });
    xml += '</tree>';
    return xml;
}



//util functions


function aa(param) {
    return '&' + param;
};



/*

Test for UK post code

Richard Harvey
rrh@crookasacat.com

22-Dec-2009

The format of UK postcodes is generally as follows, where A signifies a letter and 9 a digit.

========    ===========     ======================================================================================================
FORMAT      EXAMPLE         WHERE FOUND
========    ===========     ======================================================================================================
A9 9AA	    M1 1AA	        B, E, G, L, M, N, S, W postcode areas
A99 9AA	    M60 1NW
========    ===========     ======================================================================================================
AA9 9AA	    CR2 6XH	        Most postcode areas (not B, E, G, L, M, N, S, W, WC)
AA99 9AA	DN55 1PT
========    ===========     ======================================================================================================
A9A 9AA	    W1A 1HQ	        E1W, N1C, N1P, W1 postcode districts (high density areas where codes ran out)
========    ===========     ======================================================================================================
AA9A 9AA	EC1A 1BB	    WC postcode area; EC1-EC4, NW1W, SE1P, SW1 postcode districts (high density areas where codes ran out)
========    ===========     ======================================================================================================

so

All codes must contain a space
Split Code into 2 parts


Check each part in turn


part 1 is

A9      [BEGLMNSW][0-9]  
A99     [BEGLMNSW][0-9][0-9] 

AA9     [A-PR-UWYZ][A-HK-Y][0-9] 
AA99    [A-PR-UWYZ][A-HK-Y][0-9][0-9] 

A9A     [ENW][0-9][WCP]

AA9A    [ENS][CWE][0-9][A-HK-Y]


part 2 is ALWAYS
9AA        [0-9][ABD-HJLN-UW-Z][ABD-HJLN-UW-Z]

*/


function checkPostCode(postcode){

    var parts = postcode.toUpperCase().split(" ");
    if(parts.length != 2){
        //alert("Error Split=" + parts.length);
        return false;
    }
    if(!checkPartOne(parts[0])){
        //alert("Part One check failed");
        return false;
    }
    if(!checkPartTwo(parts[1])){
        //alert("Part Two check failed");
        return false;
    }

    return true;
}


function checkPartOne(value){

    //Most common first

    //AA9
    if(/^[A-PR-UWYZ][A-HK-Y][0-9]$/.test(value)){
        return true;
    }
    //AA99
    if(/^[A-PR-UWYZ][A-HK-Y][0-9][0-9]$/.test(value)){
        return true;
    }

    //Check for the rest
    
    //A9
    if(/^[BEGLMNSW][0-9]$/.test(value)){
        return true;
    }
    //A99
    if(/^[BEGLMNSW][0-9][0-9]$/.test(value)){
        return true;
    }
    
    //A9A
    if(/^[ENW][0-9][WCP]$/.test(value)){
        return true;
    }
    //AA9A
    if(/^[ENS][CWE][0-9][A-HK-Y]$/.test(value)){
        return true;
    }
    return false;

}

function checkPartTwo(value){

    //9AA
    return /^[0-9][ABD-HJLN-UW-Z][ABD-HJLN-UW-Z]$/.test(value);

}

//function to check for un-escaped ampersands
function fnTestAmpEscape(origURL) {
    var chars = origURL.split("");
    for (i = 0; i < chars.length; i++) {
        if (chars[i] == "&") {
            var testval = origURL.substr(i, 5);
            if (testval != "&amp;") {
                return false;
            }
        }
    }
    return true;
}



/************************************************************/
/* jquery UI Dialoug wrapper
/************************************************************/

function fnSandboxPageAjaxPopUp(pageParams, popupParams, popuptarget) {
    if (popuptarget == null) {
        popuptarget = '#popupTarget';
    }
    $(popuptarget).dialog('destroy');
    $(popuptarget).load(
        "/ajax_form.aspx",
        pageParams,
        function() {
            $(popuptarget).dialog(popupParams);
            if (!$(popuptarget).dialog('option', 'autoOpen')) {
                $(popuptarget).dialog('open');
            }
        }
    );
}

/**********************************************************/
/* convert an sql formatted date string (eg 04-Feb-2011) to js date*/
/**********************************************************/
function fnMakeJsDate(sqlDate) {
    var jsDate = null;
    var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var dateArray = sqlDate.split("-");
    if (dateArray.length == 3) {
        var day = dateArray[0];
        var year = dateArray[2];
        var month = -1;
        for (i = 0; i < monthNames.length; i++) {
            if (monthNames[i] == dateArray[1]) {
                month = i;
                break;
            }
        }
        try {
            jsDate = new Date(year, month, day, 0, 0, 0, 0);
        }
        catch (err) {
            jsDate = null;
        }
    }
    return jsDate;
}
/**********************************************************/


/**********************************************************/
/* text area to codemirror */
/**********************************************************/
function fnloadCodeMirror(ta, h){ 
    
    var v = null;
    
    try{
        v = CodeMirror.fromTextArea(
        ta,
        {
          parserfile: [
            "parsexml.js",
            "parsecss.js",
            "tokenizejavascript.js",
            "parsejavascript.js",
            "parsehtmlmixed.js"
          ],
          stylesheet: [
            "/jq132/CodeMirror-0.67/css/xmlcolors.css",
            "/jq132/CodeMirror-0.67/css/jscolors.css",
            "/jq132/CodeMirror-0.67/css/csscolors.css"
          ],
          path: "/jq132/CodeMirror-0.67/js/",
          width: "100%",
          height: h + "px"
        }      
      );
    }
    catch(exception){ 
        //alert("codemirror not loaded!");
        $.xLazyLoader({
          js: '/jq132/CodeMirror-0.67/js/codemirror.js',
          success: function(){
            v = fnloadCodeMirror(ta, h)
            //alert("codemirror loaded!");
          },
          error: function(){
            alert("codemirror load failed!");
          }
        });
    
    }
    return v;
  }
/**********************************************************/

