jQuery(function($){
    initInput();
    bindLabeledInput();
    makeDatePicker();
	$("textarea.elastic").elastic();
    $('a.nyroModal').nyroModal({ closeOnClick: false });

    if ( WELCOMED == false && LOGGED_IN == true ) {
	
        sdNyro.open(BASE_PATH + '/welcome');
    }
});

// Validator method for fckrequired
jQuery.validator.addMethod("fckrequired", function(value, element, params) {
    var fckVal = $(element).siblings('iframe').contents()
        .find('#xEditingArea iframe').contents().find('body')
        .text();
    return (fckVal.length > 0);
}, jQuery.validator.format("This field is required."));

if(typeof(console)=="undefined") {
	console = new Object();
	console.log = function() { };
	console.debug = function() { };
}

function followScroll(selector) {
    var $container = selector;

    if($container.length == 0 ) {
        return;
    }

    var offset = $container.offset();
    var topPadding = 15;
    $(window).scroll(function() {
        if ( $(window).scrollTop() > offset.top ) {
            $container.stop().animate({
                marginTop: $(window).scrollTop() - offset.top + topPadding
            });
        } else {
            $container.stop().animate({
                marginTop: 0
            });
        }
    });
}

/* BT Default Styles */
var btStyles = {
    'btHint' : {
        shrinkToFit: true,
        fill: "#FBF7AA",
        strokeWidth: 2,
        strokeStyle: "#F9E98E",
        textzIndex: 3,
        boxzIndex: 2,
        wrapperzIndex: 1,
        windowMargin: -10000,
		padding: '5px',
        clickAnywhereToClose: false,
        positions: ['right', 'left', 'top']
    },
    'btError' : function() {
        return $.extend({}, this.btHint, {
            padding: '5px',
			fill: "#F99CA6",
            strokeStyle: "#FF0000",
            strokeWidth: 1,
            killTitle: false
        });
    },
    'btOk': function() {
        return $.extend({}, this.btHint, {});
    }
};

/* Tip validator */
var validatorTip = {
    'errorPlacement': function(error, element) {

        var $tipPlacementOn = $(element);
        var $element = $(element);
        var inputName = $tipPlacementOn.attr('name');
        var $siblings = $tipPlacementOn.siblings();

        if($element.data('errlabel')) {
            $element.data('errlabel').remove();
        }
        if($element.data('tip')) {
            $element.data('tip').btOff();
        }
        $element.data('errlabel', error);

        if($tipPlacementOn.hasClass('outtaHere')) {
            $formReplacement = $siblings.filter('div[class$="Area"]');
            $tipPlacementOn = $formReplacement;

            if($formReplacement.closest('.tipHolder').length > 0) {
                $tipPlacementOn = $formReplacement.closest('.tipHolder');
            }
        } else if ($tipPlacementOn.parent().hasClass('fckErrorHolder') ) {
            $tipPlacementOn = $siblings.parent();
        } else if ($tipPlacementOn.parent().hasClass('tag-input-container')) {
            $tipPlacementOn = $siblings.filter('ul.holder');
        } else if ($tipPlacementOn.attr('datetimebind') && $tipPlacementOn.data('model') ) {
			$tipPlacementOn = $tipPlacementOn.parents('.datetimeinput').find('.dateerrorholder');
        }

        error.data('tip', $tipPlacementOn);
        $element.data('tip', $tipPlacementOn);

        if( $tipPlacementOn.next('.error-holder').length == 0) {
            var errorHolder = $('<div />').addClass('error-holder')
                .insertAfter($tipPlacementOn)
                .hide();
            $('<span />').addClass('error-msg')
                .text(error.text())
                .appendTo(errorHolder);
        } else {
            $tipPlacementOn.next('.error-holder')
                .find('.error-msg')
                .text(error.text());
        }

        var options = $.extend({}, btStyles.btError(), {trigger: 'none'});
        if(!errorHolder) {
            errorHolder = $tipPlacementOn.next('.error-holder');
        }

		if($tipPlacementOn.parents('.nyroModalCont').size())  {
			var nyroModalCont = $tipPlacementOn.parents('.nyroModalCont');
			var nyroModalLink = $tipPlacementOn.parents('.nyroModalLink');

			window.tipPlace = $tipPlacementOn;
			console.debug('nyroModalCont', nyroModalCont);
			console.debug('nyroModalLink', nyroModalLink);

			options = $.extend({}, btStyles.btError(), {
				trigger: 'none',
				offsetParent: $('body'),
				wrapperzIndex: 30000,
			});

			var btOn = function() {
				$tipPlacementOn.bt(errorHolder.html(), options).btOn();
			};
			var btOff = function() {
				$tipPlacementOn.btOff();
			};

			btOn();

			nyroModalCont.bind('scroll', function(e) {
				btOff();
				btOn();
			});

		} else {
			$tipPlacementOn.bt(errorHolder.html(), options).btOn();

		}
    },
    'success': function(label) {
        if(label.data('tip')) {
            label.data('tip').btOff();
        }
    }
}

// nyroModal abstraction
var sdNyro = {
    'settings': {
        closeOnClick: false
    },
    'open': function(url, params, callback) {
        if( !url.startsWith( BASE_PATH ) && url.startsWith('/') ) {
            url = BASE_PATH + url;
        }

        if( !jQuery.isEmptyObject(params) ) {
            url = url + '?';
            for ( var key in params ) {
                url = url + (key + '=' + params[key]);
            }
        }

        $.nmManual(url, {
            closeOnClick: false,
            callbacks: {
                afterReposition: function() {
                    if( jQuery.isFunction(callback) ) {
                        callback();
                    }
                }
            }
        });
    },
    'close': function() {
        //$('a.nyroModalClose').trigger('click');
        $.nmTop().close();
    }
};

function bindLabeledInput() {
	$(".labeled-input").each(function() {
		var $this = $(this);

		if(!$this.data("bind.labeled.input")) {
			$this.data("bind.labeled.input", true);

            $this.parents('form').attr('hasLabelInput', true);

			this.label = $this.attr("defaultvalue");

			this.onfocus = function() {
				if(this.value==this.label) {
					this.value = "";
					$(this).removeClass("labeled-input");
					$(this).addClass("entered");
				}
			};

			this.onblur = function() {
				if(this.value=="") {
					this.value = this.label;
					$(this).addClass("labeled-input");
					$(this).removeClass("entered");
				}
			};

			if(this.value=="")
				this.value = this.label;
			else
				$(this).addClass("entered");
		}
	});

    bindSanitizeLabeledInput();
}

function bindSanitizeLabeledInput() {
    $('form[hasLabelInput=true]').bind('submit', function() {
        var $labels = $(this).find('.labeled-input');
        $labels.each(function() {
            if($(this).attr("defaultvalue") == $(this).val()) {
                $(this).val("");
            }
        });
    });
}

function makeDatePicker() {
    $('input.date').each(function(){
        var self = $(this);
        var dateformat = 'dd MM yy';
        self.datepicker({
            dateFormat: dateformat

        });
        var formvalue = $.datepicker.parseDate('dd/mm/yy', self.val());
        self.datepicker('setDate', formvalue);
    });
}

// select[id!="edit-tags"]
function initInput() {
    jQuery ('input:text, input:password').each(function(){
        var _el = jQuery(this);

        if(_el.data('inited') == true) {
            //do nothing
        } else {
            var _val = _el.val();
           // _el.before('<b></b>');
           // _el.after('<em></em>');
            _el.data('inited', true);
        }
    });
}

function kobind(attr, viewModel, root) {
	root = root || window.document.body;
	$('*[' + attr + ']', root).each(function() {
		var jqthis = $(this);
		ko.applyBindingsToNode(this, undefined, viewModel, attr);
	});
}

var sdDialog = {
    'alert': function(msg, title, callback) {
        if(!title)
            title = "NOC Alumni Portal";

        if(jQuery('#alert-dialog').length == 0) {
            jQuery('<div id="alert-dialog"><span class="first"></span></div>').appendTo(document.body);
        }

        jQuery("#alert-dialog").attr("title", title);
        jQuery("#alert-dialog span.first").html(msg);
        jQuery("#alert-dialog").dialog({
            title: title,
            modal: true,
            resizable: false,
            minHeight: 60,
            buttons: {
                OK: function() {
                    jQuery( this ).dialog("close");
                    if(callback)
                        callback();
                }
            }
        });
    },
    'confirm': function(msg, yesCallback, title, noCallback) {
        if(!title)
            title = "NOC Alumni Portal";
	
	if(jQuery('#confirm-dialog').length == 0) {
            jQuery('<div id="confirm-dialog"><span class="first"></span></div>').appendTo(document.body);
        }

        jQuery('#confirm-dialog').attr('title', title);
        jQuery('#confirm-dialog span.first').html(msg);
        jQuery('#confirm-dialog').dialog({
            title: title,
            modal: true,
            resizable: false,
            minHeight: 60,
            buttons: {
                Yes: function() {
                    if(yesCallback)
                        yesCallback();
                },
                No: function() {
                    jQuery( this ).dialog("close");
                    if(noCallback)
                        noCallback();
                }
            }
        });
    },
    'close': function() {
        jQuery("#alert-dialog").dialog("close");
        jQuery("#confirm-dialog").dialog("close");
    }
}

function popup(url, width, height, settings) {
    var leftPosition = (screen.width) ? (screen.width-width)/2 : 0;
    var topPosition = (screen.height) ? (screen.height-height)/2 : 0;
    var config = 'height='+height+',width='+width+',top='+topPosition+',left='+leftPosition;
    if(settings) {
        config += ',' + settings;
    }
    var newwin = window.open(url,'NOC Alumni', config);
    newwin.focus();
    return false;
}

String.prototype.startsWith = function(str){
    return (this.indexOf(str) === 0);
}

$(function() {
	$('.tagInput').each(function() {
		var tagInput = $(this);

		tagInput.find('a[tag]').click(function() {
			var tag = $(this);
			var tagName = tag.attr('tag');
			var select = tagInput.find('select');
			select.trigger('addItem', [{ title: tagName, value: tagName }]);
			console.debug("select ", select);
			return false;
		});
	});
});

