﻿// TODO - put all these functions in the Website.Behavior namespace


Type.registerNamespace('Website.Behavior');


/// <summary>
/// Handles the click event of _clickByProxy divs
/// </summary>
Website.Behavior.clickByProxy_click = function () {
    Relational.Utility.clickInside(this,'_ClickTarget');
}

// enableOnLoad
//
// Enables elements on load
//
Website.Behavior.enableOnLoad = function(triggerTagName, targetClassName)
{
    if (!document.getElementsByTagName) return false;
    var targetElements = Relational.Utility.getElementsByClassName(triggerTagName, targetClassName);
    for (var i=0; i < targetElements.length; i++) {
        Relational.Utility.disableAnchor(targetElements[i],false);
    }
}


// showOnLoad
//
// Shows elements on load
//
Website.Behavior.showOnLoad = function(triggerTagName, targetClassName)
{
    if (!document.getElementsByTagName) return false;
    var targetElements = Relational.Utility.getElementsByClassName(triggerTagName, targetClassName);
    for (var i=0; i < targetElements.length; i++) {
        targetElements[i].style.display='block';
    }
}


// hideOnLoad
//
// Hides elements on load
//
Website.Behavior.hideOnLoad = function(triggerTagName, targetClassName)
{
    if (!document.getElementsByTagName) return false;
    var targetElements = Relational.Utility.getElementsByClassName(triggerTagName, targetClassName);
    for (var i=0; i < targetElements.length; i++) {
        targetElements[i].style.display='none';
    }
}

// isPageValid
//
// Grabs the input radiobuttonlist and returns the selected value (or undefined if there is none) - can pass in either the id or the object
//
Website.Behavior.getRadioSelectedValue = function (radioButtonList) {
    if (typeof(radioButtonList) != 'object') { radioButtonList = $get(radioButtonList) } // Accept ID of element (string) or the element itself
    var options = radioButtonList.getElementsByTagName('input');
    for(i=0;i<options.length;i++) {
        if(options[i].checked) {
            return options[i].value;
        }
    }
}

// isPageValid
//
// This function checks the validation group of the input button and checks if the associated validators are valid.  If the button does not 
// belong to a validation group it validates the entire page.  
// NOTE: for the validationgroup support this function depends on js properties added by the Relational.Controls.LinkButton so if you call this with a 
// normal linkbutton with CausesValidation=false we will still validate the page (so change your asp:linkbutton to Relational:LinkButton)
//
Website.Behavior.isPageValid = function (button) {
    if (typeof(button.causesValidation) == 'undefined' || button.causesValidation == true) {
        if (typeof(Page_ClientValidate) == 'function') {
            // at least one validator on page - validate the page and return the result
            Page_ClientValidate(button.validationGroup);
            return Page_IsValid;
        }
        else {
            // no validators on the page so the page is valid (Page_ClientValidate, etc are not rendered on the page)
            return true;
        }
    }
    else {
        return true; //causesValidation = false
    }
}

Website.Behavior.WaitButtonClick = function (evt, context) {
    var waitButton = this;
    if (waitButton) {
        if (waitButton.tagName=='SPAN') waitButton=waitButton.parentNode;
        if(Website.Behavior.isPageValid(waitButton) == true) {
            // build DummyButton
            var dummyButton = document.createElement('a');
            dummyButton.className = waitButton.className + " DummyButton"; // Keep same CSS classes as original link
            dummyButton.style.cssText = waitButton.style.cssText; // Keep any styles set manually on the page
            dummyButton.innerHTML = String.format("<span></span><img src='../images/dingbats/spinner.tiny.2.gif' />{0}", context.waitText);
            //dummyButton.innerHTML="<span></span><img src='../images/dingbats/spinner.tiny.2.gif' />Please wait...";
            waitButton.parentNode.insertBefore(dummyButton,waitButton); 
            // hide WaitButton
            Relational.Utility.changeClassName(waitButton,'SmallButton','Hidden');
        }
    } 
}

function ShowControl(targetId) {
    var target = $get(targetId);
    if (target != null) {
        target.style.display='block';
    }
}

function HideControl(targetId) {
    var target = $get(targetId);
    if (target != null) {
        target.style.display='none';
    }
}

// changeClassNameHandler
//
// provides an event handler for changeClassName (unpacks variables, cancels event, etc)
//
Website.Behavior.onClickPopupLink = function (evt, context) 
{
    // get the destination
    var targetHref = context.targetHref;
    if(typeof(targetHref) != 'undefined' && targetHref != null) {
        // show the window    
        window.open(targetHref ,"FanfocusPopup", "height=600,width=400,location=no,menubar=no,status=no,toolbar=no,scrollbars=yes"); 
        // cancel the event to stop any scroll
        return Relational.Utility.eventCancel(evt);
    }
}


checkToggle = function(
                checked, // to check or not
                targetElement // the id of the div containing checkboxes to flip
                )
{
    if (typeof(targetElement) != 'object') { targetElement = $get(targetElement) } // Accept ID of element (string) or the element itself
    if (!targetElement.getElementsByTagName) return false;
    var targetElements = targetElement.getElementsByTagName('input');
    for (var i in targetElements) {
        if (targetElements[i].disabled == false) targetElements[i].checked = checked;
    }
}




// wireUpCheckToggle 
//
wireUpCheckToggle = function(
                        triggerClassName, // class of the trigger elements (e.g. 'PopAroundTrigger')
                        triggerIdPattern, // regex pattern matching the trigger element's ID, e.g. 'PopAroundTrigger_(\d*)' 
                        targetIdPattern // replacement pattern for the target element's ID, e.g. 'PopAroundTarget_$1'
                    ) 
{
    if (!document.getElementsByTagName) return false;
    var triggerElements = Relational.Utility.getElementsByClassName('input', triggerClassName);
    var arrIndex;
    for (arrIndex = 0; arrIndex < triggerElements.length; arrIndex++) {
            // Find corresponding element 
            var triggerElement = triggerElements[arrIndex];
            var targetElementId = triggerElement.id.replace(new RegExp(triggerIdPattern), targetIdPattern);
            // Create event handler
            var f = "checkToggle(this.checked, '{0}'); ";
            f = String.format(f, targetElementId);
            // Store the event handler with the element itself
            eval("triggerElement.checkToggle = function() { "  + f  + " }" );
            // Wire up the handler
            $addHandler(triggerElement, 'click', triggerElement.checkToggle);
    }
} 

// changeClassNameHandler
//
// provides an event handler for changeClassName (unpacks variables, cancels event, etc)
//
Website.Behavior.changeClassNameHandler = function (evt, context) 
{
    var sourceElementId = context.sourceElementId;
    var targetElementId = sourceElementId.replace(new RegExp(context.triggerIdPattern), context.targetIdPattern);
    Relational.Utility.changeClassName(targetElementId, context.targetClassNameBefore, context.targetClassNameAfter); 
    if (context.appendCancel == true) return Relational.Utility.eventCancel(evt);
}

// showReplyOnClick
//
// 1) Changes the class of the click target from "HideReply" to "ShowReply"
// 2) Finds the iframe target and changes it's source to the proxy reply page (proxy\ReplyInline.aspx)
//
Website.Behavior.showReplyOnClick = function (evt, context) {
    // 1) 
    var sourceElementId = context.sourceElement.id;
    var reSourceElement = new RegExp('ReplyFormTrigger_(.*?)_(\\d+)_(\\d+)');
    var targetElementId = sourceElementId.replace(reSourceElement, 'ReplyFormTarget_$1_$2');
    Relational.Utility.changeClassName(targetElementId, 'HideReply', 'ShowReply'); 
    // 2)
    var targetIframeId = sourceElementId.replace(reSourceElement, 'IframeTarget_$1_$2');
    var targetIframe = $get(targetIframeId);
    if(typeof(targetIframe) != 'undefined' && targetIframe != null) {
        var mParentID = reSourceElement.exec(sourceElementId);
        if(mParentID != null) {
            targetIframe.src = String.format("../proxy/ReplyInline.aspx?pid={0}&rid={1}", mParentID[2], mParentID[3]);
        }
    }
    return Relational.Utility.eventCancel(evt);
}

// eventCancelHandler
//
// provides an event handler for the eventCancel function
//
Website.Behavior.eventCancelHandler = function (evt, context) {
    return Relational.Utility.eventCancel(evt);
}

// showReplyOnClick
//
// shows the reply form for this trigger
//
//Website.Behavior.showReplyOnClick = function (evt, context) 
//{
//    var buttonId = context.sourceElementId;
//    var targetElementId = buttonId.replace(new RegExp('ReplyFormTrigger_(.*?)_(\d*)'), 'ReplyFormTarget_$1_$2');
//    Relational.Utility.changeClassName(targetElementId, 'HideReply', 'ShowReply'); 
//    return Relational.Utility.eventCancel(evt);
//}


Website.Behavior.toggleOff= function(evt, context)
{
    Relational.Utility.changeClassName(this, "On", "Off");
        return Relational.Utility.eventCancel(evt);
}
        
Website.Behavior.toggleOn= function(evt, context)
{
    Relational.Utility.changeClassName(this, "Off", "On");
        return Relational.Utility.eventCancel(evt);
}

// ===================================================================== Column Chooser

Website.Behavior.hideColumnChooser= function()
{
    Relational.Utility.changeClassName(this, "Hover", "NoHover");
}
    
Website.Behavior.showColumnChooser= function()
{
    Relational.Utility.changeClassName(this, "NoHover", "Hover");
}


/************************************** BEHAVIORS FOR THIS APPLICATION */

Website.Behavior.addBehaviors = function () {
    // show & hide on load
    Website.Behavior.showOnLoad('div','ShowOnLoad');
    Website.Behavior.showOnLoad('a','ShowOnLoad');
    Website.Behavior.hideOnLoad('img','HideOnLoad');
    Website.Behavior.hideOnLoad('div','HideOnLoad');

    // enable on load
    Website.Behavior.enableOnLoad('a','EnableOnLoad');
   
    // check all/none checkboxes 
    wireUpCheckToggle('CheckAllTrigger', 'CheckAllTrigger_(.*)', 'CheckAllTarget_$1');

    // wire up rules
    Website.Behavior.wireUpRules();
}


Website.Behavior.wireUpRules = function () {
    var myrules = {

        // Wire up _clickByProxy divs to click through to the a._ClickTarget element
        'div._ClickByProxy' : function(element){
            $addHandler(element, 'click', Website.Behavior.clickByProxy_click);
        },

        // Wire up column chooser
        'div._ColumnChooserContainer' : function(element){
            $addHandler(element, 'mouseover', Website.Behavior.showColumnChooser);
            $addHandler(element, 'mouseout', Website.Behavior.hideColumnChooser);
        },

        'a._WaitButton' : function(element){
            var context = { waitText : 'Please wait...' };
            $addHandler(element, 'click', Function.createCallback(Website.Behavior.WaitButtonClick, context));
        },

        'a._WaitButtonMin' : function(element){
            var context = { waitText : ' ...' };
            $addHandler(element, 'click', Function.createCallback(Website.Behavior.WaitButtonClick, context));
        },

        // calls our local custom function which changes the target element to include the "ShowReply" class and then sets the source of the coresponding iframe
        'a._ShowReplyOnClickIframe' : function(element){
            var context = { sourceElement : element };
            var clickCallback = Function.createCallback(Website.Behavior.showReplyOnClick, context);
            $addHandler(element, 'click', clickCallback);
        },

        // Changes Hidden to Visible on the target elements class
        'a._ShowOnClickTrigger' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : 'ShowOnClickTrigger_(.*?)', targetIdPattern : 'ClickTarget_$1', targetClassNameBefore : 'Hidden', targetClassNameAfter : 'Visible', appendCancel : true };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'click', clickCallback);
        },

        // Changes Visible to Hidden in the target elements class (supports multiple triggers for same target - e.g. HideOnClickTrigger1_PhotoUpload, HideOnClickTrigger2_PhotoUpload, etc)
        'a._HideOnClickTrigger' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : 'HideOnClickTrigger(.*?)_(.*?)', targetIdPattern : 'ClickTarget_$2', targetClassNameBefore : 'Visible', targetClassNameAfter : 'Hidden', appendCancel : true };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'click', clickCallback);
        },

        // Changes Visible to Hidden in the trigger elements class (note this class does not cancel the click event for the ConcealablePanels - have to post back to save state)
        'div._HideSelfOnClick' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : '(.*)', targetIdPattern : '$1', targetClassNameBefore : 'Visible', targetClassNameAfter : 'Hidden', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'click', clickCallback);
        },

        // Generic show/hide on click - changes the ShowTarget_ element from Hidden to Visible and the HideTarget_ element from Visible to Hidden
        'a._ShowHideOnClickTrigger' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : 'ShowHideOnClickTrigger_(.*?)', targetIdPattern : 'ShowTarget_$1', targetClassNameBefore : 'Hidden', targetClassNameAfter : 'Visible', appendCancel : true };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'click', clickCallback);
            var context = { sourceElementId : element.id, triggerIdPattern : 'ShowHideOnClickTrigger_(.*?)', targetIdPattern : 'HideTarget_$1', targetClassNameBefore : 'Visible', targetClassNameAfter : 'Hidden', appendCancel : true };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'click', clickCallback);
        },

        // changes the target element's class from HoverOff to HoverOn on mouseover and vice versa for mouseout
        'div._ShowPostControlsTrigger' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : 'ShowPostControlsTrigger_(.*?)_(\d*)', targetIdPattern : 'ShowPostControlsTarget_$1_$2', targetClassNameBefore : 'HoverOff', targetClassNameAfter : 'HoverOn', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'mouseover', clickCallback);
            var context = { sourceElementId : element.id, triggerIdPattern : 'ShowPostControlsTrigger_(.*?)_(\d*)', targetIdPattern : 'ShowPostControlsTarget_$1_$2', targetClassNameBefore : 'HoverOn', targetClassNameAfter : 'HoverOff', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'mouseout', clickCallback);
        },

        // Pop-arounds (wikis, etc.) - changes class name on mouseover and back on mouse out
        'div.PopAroundTrigger' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : 'PopAroundTrigger_(.*?)_(\d*)', targetIdPattern : 'PopAroundTarget_$1_$2', targetClassNameBefore : 'HighlightOff', targetClassNameAfter : 'HighlightOn', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'mouseover', clickCallback);
            var context = { sourceElementId : element.id, triggerIdPattern : 'PopAroundTrigger_(.*?)_(\d*)', targetIdPattern : 'PopAroundTarget_$1_$2', targetClassNameBefore : 'HighlightOn', targetClassNameAfter : 'HighlightOff', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'mouseout', clickCallback);

        },

        // Search box pop-around (input)
        'input.SearchText' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : '(.*)', targetIdPattern : 'PopAroundTarget_Search_0', targetClassNameBefore : 'HighlightOff', targetClassNameAfter : 'HighlightOn', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'focus', clickCallback);
        },

        // Search box pop-around (input)
        'a.SearchClose' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : '(.*)', targetIdPattern : 'PopAroundTarget_Search_0', targetClassNameBefore : 'HighlightOn', targetClassNameAfter : 'HighlightOff', appendCancel : true };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'click', clickCallback);
        },

        // Focus color on form fields (input)
        'input.FormField' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : '(.*)', targetIdPattern : '$1', targetClassNameBefore : 'NoFocus', targetClassNameAfter : 'Focus', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'focus', clickCallback);
            var context = { sourceElementId : element.id, triggerIdPattern : '(.*)', targetIdPattern : '$1', targetClassNameBefore : 'Focus', targetClassNameAfter : 'NoFocus', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'blur', clickCallback);
        },

        // Focus color on form fields (textarea)
        'textarea.FormField' : function(element){
            var context = { sourceElementId : element.id, triggerIdPattern : '(.*)', targetIdPattern : '$1', targetClassNameBefore : 'NoFocus', targetClassNameAfter : 'Focus', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'focus', clickCallback);
            var context = { sourceElementId : element.id, triggerIdPattern : '(.*)', targetIdPattern : '$1', targetClassNameBefore : 'Focus', targetClassNameAfter : 'NoFocus', appendCancel : false };
            var clickCallback = Function.createCallback(Website.Behavior.changeClassNameHandler, context);
            $addHandler(element, 'blur', clickCallback);
        },

        // close buttons for our new iframe modals
        'a._IframeCloseModalButton' : function(element){
            $clearHandlers(element);
            $addHandler(element, 'click', Function.createCallback(Fansite.ModalButton.hideModalFromIframe, null));
        },

        // Hover toggle
        'div._HoverToggle' : function(element){
            $clearHandlers(element);
            $addHandler(element, 'mouseover', Function.createCallback(Website.Behavior.toggleOn, {}));
            $addHandler(element, 'mouseout', Function.createCallback(Website.Behavior.toggleOff, {}));
        },

        // popup links
        'a._PopupLink' : function(element){
            var context = { targetHref : element.href };
            var clickCallback = Function.createCallback(Website.Behavior.onClickPopupLink, context);
            $addHandler(element, 'click', clickCallback);
            // wipe out any target and href for the target
            element.target = "";
            element.href = '#';
        },

        // just a class you can add to any link button to eat the click event and have the link do nothing
        'a._CancelClickEvent' : function(element){
            $addHandler(element, 'click', Function.createCallback(Website.Behavior.eventCancelHandler, null));
        }

    };
    Relational.Utility.Rules.register(myrules); 
    Relational.Utility.Rules.apply(); 
}


// onBeginRequestAsync
//
// Fires before an async request is sent to the server - we take this opportunity to hide content that is about to chage
//
//function onBeginRequestAsync(sender, eventArgs) {
//    // hide the content divs 
//    Website.Behavior.hideOnLoad('div','ShowOnLoadAsync');
//    // show the progress indicators
//    Website.Behavior.showOnLoad('div','HideOnLoadAsync');
//    Website.Behavior.showOnLoad('img','HideOnLoadAsync');
//}

// onload is only called for synchronous requests - instead we use pageLoaded - however this is too early for the page manager object so we hookup the addBehaviors function at the bottom of the master page
//$addHandler(window, "load", addBehaviors);

// Notify ScriptManager that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

