
function formatNumber(number, thousandSep, decimalSep){
  number += '';
  x = number.split('.');
  x1 = x[0];
  x2 = x.length > 1 ? decimalSep + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + thousandSep + '$2');
  }
  return x1 + x2;
}

Number.prototype.formatAmount = function() {
    return formatNumber(this, ',', '.');
}

postJson = function (url, data, successCallback, errorCallback) {
    var contentType = data.contentType == undefined ? 'application/x-www-form-urlencoded' : data.contentType;
    var postData = data.data == undefined  ? data : data.data;
    $.ajax({
        url: url,
        data: postData,
        //processData: true,
        //dataType: 'text json',
        dataType: 'json',
        error: function (jqXHR, textStatus, errorThrown) {
            if (errorCallback != undefined)
                errorCallback(jqXHR, textStatus, errorThrown);
            else
                showMessage('Error', errorThrown);
        },
        success: function (data, textStatus, jqXHR) {
            if (successCallback != undefined)
                successCallback(data, textStatus, jqXHR);
        },
        type: 'POST',
        contentType: contentType //"application/json; charset=utf-8" //Necessary for the JsonValueProviderFactory to work properly
    });
}

getJsonp = function (url, data, successCallback, errorCallback) {
    $.ajax({
        type: 'get',
        url: url,
        data: data,
        dataType: 'jsonp',
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            if (errorCallback != undefined)
                errorCallback(XMLHttpRequest, textStatus, errorThrown);
            else
                showMessage('Error', errorThrown);
        },
        success: function (data, textStatus, XMLHttpRequest) {
            if (successCallback != undefined)
                successCallback(data, textStatus, XMLHttpRequest);
        }
    });
}

jQuery.fn.grid = function(options) {
    var $grid = $(this);
    var grid = $grid[0];

    var defaults = {
        url: null,
        renderRow: function(rowData, row) {},
        beforeLoadResults: function(results) {},
        afterLoadResults: function(results) {},
        noResultsMessage: 'No results',
        errorMessage: 'An error occured',
        onError: null,
        append: false,
        prepend: false
    };

    grid.options = $.extend(defaults, options);

    if (grid.options.url == null)
        throw new Exception("No URL specified.");
}

jQuery.fn.gridLoading = function(options) {
    var loadingHtml = '<li class="loading last" style="text-align:center;"><img src="/Content/img/Comun/fd_loading.gif" alt="" /></li>';
    $(this).gridAddHtml(loadingHtml, options);
}

jQuery.fn.gridLoad = function(params, options) {
    var $grid = $(this);
    var grid = $grid[0];

    $grid.gridLoading(options);
    $grid.find('li.error').remove();

    if (params == null)
        params = {};

    if (options == null)
        options = {};

    var url = (options.url == undefined) ? grid.options.url : options.url;

    postJson(url, params, function(results) {
        grid.options.beforeLoadResults(results);
        $grid.gridLoadData(results, options);
        grid.options.afterLoadResults(results);
    }, function() {
        if (grid.options.onError != null) {
            grid.options.onError();
        } else { 
            var errorHtml = '<li class="error last"><p>' + grid.options.errorMessage + '</p></li>';
            $grid.gridAddHtml(errorHtml, options);
        }
    });
}

jQuery.fn.gridLoadData = function(results, options) {
    var $grid = $(this);
    var grid = $grid[0];
    var gridid = $grid.attr('id');
    var templateId = '#' + gridid + '_template';
    var $template = $(templateId);
    var cachedItemTemplate = $template.html();
    var itemTemplate;

    var data = results.Data;

    $grid.find('li.loading').remove();
    $grid.find('li.noresults').remove();

    var opt = $.extend(grid.options, options);

    var $mark = null;

    if (!opt.append && !opt.prepend)
      $grid.empty();
    else if (opt.prepend)
      $mark = $grid.find('li:first');

    var noResultsHtml = '<li class="noResult last" style="display:none;"><p>' + grid.options.noResultsMessage + '</p></li>';
    
    $grid.gridAddHtml(noResultsHtml, options);
    if (data.length == 0) {
      $grid.find('.noResult').show();
      return;
    }

    var $firstItem = null; // for preppend

    var currentItems = $grid.find('> li').length;
    for (i = 0; i < data.length; i++) {
        var itemid = i + currentItems;
        var item = data[i];
            
        itemTemplate = cachedItemTemplate;
        
        // replace property templates 
        for (var prop in item) {
          if (item.hasOwnProperty(prop)) {
            var match = new RegExp('{' + prop + '}', 'g');
            itemTemplate = itemTemplate.replace(match, item[prop]);
          }
        }
        
        var match = new RegExp('{rowid}', 'g');
        itemTemplate = itemTemplate.replace(match, gridid + '_' + itemid.toString());

        // it's faster to insert HTML than a jquery object
        if (!opt.prepend)
          $grid.append(itemTemplate);
        else {
          if ($mark.length == 0)
            $grid.append(itemTemplate);
          else
            $mark.before(itemTemplate);
        }

        var $itemTemplate = $('#' + gridid + '_' + itemid.toString());
        
        if ($mark != null && $mark.length == 0)
          $mark = $itemTemplate;

        // odd and even
        if (i % 2 == 1)
            $itemTemplate.addClass('alt');

        // change wsrc => src
        $itemTemplate.find('img').each(function(i, el) {
          var wsrc = $(el).attr('wsrc');
          if (wsrc != '' && wsrc != 'null' && wsrc != 'undefined')
            $(el).attr('src', wsrc);
        });

        // change whref => href
        $itemTemplate.find('a').each(function(i, el) {
          var whref = $(el).attr('whref');
          if (whref != '')
            $(el).attr('href', whref);
        });

        // rendering callback
        grid.options.renderRow(item, $itemTemplate);
    }

    $grid.find('> li:last').addClass('last');
}

jQuery.fn.gridAddHtml = function(html, options) {
    var $grid = $(this);
    var grid = $grid[0];
    var opt = $.extend(grid.options, options);

    if (opt.append)
      $grid.append(html);
    else if (opt.prepend)
      $grid.prepend(html);
    else
      $grid.html(html);
}

function sortOnHeaderClick(list, parameters, columnSorting, columnsClass){
    currentPageNumber = 1;
    parameters['pageNumber'] = currentPageNumber;
    changeDirection(columnSorting, columnsClass);
    
    sortGrid(list, parameters, columnSorting, columnsClass);
}

function changeDirection(li, columnsClass) {
    $li = $(li);
    var direction = $li.attr("direction");
    
    cleanColumns(columnsClass);

    if (direction == null || direction == 'undefined' || direction == 'Descending') {
        $li.attr('direction', 'Ascending');
        $li.removeClass('noDirection');
        $li.addClass('Ascending');
    }

    if (direction == 'Ascending') {
        $li.attr('direction', 'Descending');
        $li.removeClass('noDirection');
        $li.addClass('Descending');
    }
}

function sortGrid(list, parameters, columnSorting, columnClass) {
    if(list == null || parameters == null || columnSorting == null || columnClass == null){
        return;
    }
    
    parameters['propertySorting'] = $(columnSorting).attr('sort');
    parameters['direction'] = getDirection(columnSorting, columnClass);

    $('#' + list).gridLoad(parameters);
}

function getDirection(li, columnsClass) {
    $li = $(li);
    var direction = $li.attr("direction");

    if (direction == null || direction == 'undefined') {
        cleanColumns(columnsClass);
        $li.attr('direction', 'Ascending');
        $li.removeClass('noDirection');
        $li.addClass('Ascending');

        direction = 'Ascending';
    }

    return direction;
}

function cleanColumns(columnsClass) {
    $('.' + columnsClass).removeAttr('direction');
    $('.' + columnsClass).removeClass('Descending');
    $('.' + columnsClass).removeClass('Ascending');
    $('.' + columnsClass).addClass('noDirection');
}

function getColumnSorting(columnsClass) {
    var columns = $('.' + columnsClass);
    var result = null;

    $.each(columns, function (i) {
        column = columns[i];

        if ($(column).attr('direction') != null) {
            result = column;
        }
    });

    return result;
}

function getSortableParameters(columnClass) {
    var columnSorting = this.getColumnSorting(columnClass);
    
    var parameters = [{name:"pageNumber",value:"1"},
                      {name:"propertySorting",value:$(columnSorting).attr('sort')},
                      {name:"direction",value:getDirection(columnSorting, columnClass)}]

    return parameters;
}

$().ready(function () {
    $('.wnumberBox').numberBox();
    $('.wTelephoneBox').telephoneBox();
    $('.welastic').elastic();

    $('.wlimit').bind('textchange', function (event, previousText) {
        $this = $(this);
        var id = $this.attr('id');
        var maxLength = $this.attr('maxlength');
        var template = $this.attr('limit');
        var currentLength = $this.val().length * 1;
        var lengthToShow = maxLength - currentLength;
        if(lengthToShow < 0) {
            lengthToShow = 0;
        }

        $('#' + id + '-inf').html(template.format(lengthToShow));
    });

    $('.wlimit').each(function(index) {
        $this = $(this);
        var id = $this.attr('id');
        var maxLength = $this.attr('maxlength');
        var template = $this.attr('limit');
        var currentLength = $this.val().length * 1;
        $('#' + id + '-inf').html(template.format(maxLength - currentLength));
    });
    
    // password strength
    $('.wpasswordStrength')
        .change(showPasswordStrength)
        .keyup(showPasswordStrength)
        .keydown(showPasswordStrength)
        .each(function(index, item) {
            var passwordStrengthId = $(item).attr('strength-validator');
            var divPasswordStrength = '<div id="' + passwordStrengthId + '" style="display:none;" class="passSecurity clearfix"><div class="unsafe"><div class="cv"></div><p>unsafe</p></div><div class="safe"><div class="cv"></div><p>safe</p></div></div>';
            var $inf = $('#' + $(item).attr('id') + '-inf');
    
            if ($inf.length > 0)
                $inf.after(divPasswordStrength);
            else
                $(item).after(divPasswordStrength);
        });

    $.setMaxLength();
    
    $('.wback').click(function () {
        window.history.go(-1);
    });

    $.watermark.options = {
      className: 'dim',
      useNative: false,
      hideBeforeUnload: false
    };

    $.each($('.wDimmed'), function(){
       if(isAndroid())
           $(this).attr('placeholder', $(this).attr('title'));
       else
           $(this).watermark($(this).attr('title'));
    });

     // guidelines
     $.each($('.wGuideLine'), function(){
        var name = $(this).attr('name');
        var text = $(this).attr('guideline');
       
        if(name != "" && text != null)
        {
            // set the text of the guideline
            $('#' + name + '-guideline').html($('#' + name + '-guideline').html().format(text));

            $(this).focus(function (e) {
                if ( $('#showGuideLines').length == 0 || ($('#showGuideLines').is(':checked')) ){
                    $('.wGuideLineBox').hide();
                    $('#' + name + '-guideline').show();
                }
            });
        }
     });

     $('.wGuideLineBoxClose').live('click', function () {
        $(this).parents('.wGuideLineBox').hide();
     });


     $('.wDraggable').draggable({
        containment: '.layout'
     });


});

String.prototype.ToBoolean = function() {
    return (/^true$/i).test(this);
};

Boolean.parse = function (str) {
  switch (str.toLowerCase ()) {
    case "true":
      return true;
    case "false":
      return false;
    default:
      throw new Error ("Boolean.parse: Cannot convert string to boolean.");
  }
};


(function ($) {
    $.fn.rssfeed = function (url, options) {

        // Set pluign defaults
        var defaults = {
            limit: 10,
            content: true,
            snippet: true,
            errormsg: '',
            key: null,
            isHighlighted: false,
            linktarget: '_self'
        };
        var options = $.extend(defaults, options);

        // Functions
        return this.each(function (i, e) {
            var $e = $(e);

            // Add feed class to user div
            if (!$e.hasClass('rssFeed')) $e.addClass('rssFeed');

            // Check for valid url
            if (url == null) return false;

            // Create Google Feed API address
            var api = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + encodeURIComponent(url);
            if (options.limit != null) api += "&num=" + options.limit;
            if (options.key != null) api += "&key=" + options.key;
            api += "&output=json_xml";
            // Send request
            $.getJSON(api, function (data) {

                // Check for error
                if (data.responseStatus == 200) {

                    // Process the feeds
                    _callback(e, data.responseData, options);
                } else {
                    _callbackError(e, options);
                };
            });
        });
    };

    // Callback function to create HTML result
    var _callback = function (e, data, options) {

        // Get JSON feed data
        var feeds = data.feed;
        if (!feeds) {
            return false;
        }
        var html = '';


        // Get XML data for media (parseXML not used as requires 1.5+)
        var xml = getXMLDocument(data.xmlString);
        var xmlEntries = xml.getElementsByTagName('item');

        if (feeds.entries.length > 0) {
            // Add feeds
            for (var i = 0; i < feeds.entries.length; i++) {
                // Get individual feed
                var entry = feeds.entries[i];

                var articleImage = jQuery(entry.content).find('img').attr('src');
                if (articleImage == undefined) {
                    articleImage = '/Content/_Reemplazables/img_post.jpg';
                }
                // Format published date
                var entryDate = new Date(entry.publishedDate);
                var date = entryDate.formatDate();
                var time = entryDate.formatDate('hh:mm');

                if (options.isHighlighted == false) {
                    html += '<ul>';
                    html += '<li class="clearfix">';
                    html += '<a href="' + entry.link + '" title="' + entry.title + '" class="imgCont">';
                    html += '<img src="' + articleImage + '" alt="' + entry.title + '" />';
                    html += '</a><div class="txtCont"><span>' + date + ' | <strong>' + time + '</strong> <span>By ' + entry.author + '</span></span>';
                    html += '<a href="' + entry.link + '"title="' + entry.title + '">' + entry.title + '</a>';
                    html += '<p>' + entry.contentSnippet + '</p></div></li>';
                    html += '</ul>';
                } else {
                    html += '<div class="articleTop clearfix"><div class="articleTopImg">';
                    html += '<img src="' + articleImage + '" alt="' + entry.title + '" />';
                    html += '</div><div class="articleTopTxt">';
                    html += '<span>' + date + ' | <strong>' + time + '</strong> <span>By ' + entry.author + '</span></span>';
                    html += '<a href="' + entry.link + '" title="' + entry.title + '">' + entry.title + '</a>';
                    html += '</div></div><p>' + entry.contentSnippet + '</p>';
                }

            }
            $(e).html(html);
        } else {
            _callbackError(e, options);
        }
    };

    var _callbackError = function(e, options) {

        var html = '';
        if (options.isHighlighted == false) {
            html += '<div class="viewProject noResult clearfix"><p>No results</p></div>';
            
        } else {
            html += '<div class="viewProject noResult clearfix"><p>No results</p></div>';
                     
        }
        $(e).html(html);
    };

    function getXMLDocument(string) {
        var browser = navigator.appName;
        var xml;
        if (browser == 'Microsoft Internet Explorer') {
            xml = new ActiveXObject('Microsoft.XMLDOM');
            xml.async = 'false'
            xml.loadXML(string);
        } else {
            xml = (new DOMParser()).parseFromString(string, 'text/xml');
        }
        return xml;
    }

})(jQuery);

jQuery.fn.loadRss = function(feedsUrl, options, successCallback, onError)
{
    // Set pluign defaults
    var defaults = {
        limit: 10,
        errormsg: '',
        key: null,
        callbackFn: '',
        cross: false,
        datatype : 'json',
        googleResultType: 'json'
    };
    var options = $.extend(defaults, options);

    feedsUrl = document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=' + encodeURIComponent(feedsUrl) + '&num='+ options.limit;
    if(options.callbackFn != '') feedsUrl += "&callback=" + options.callbackFn;
    if(options.googleResultType != '') feedsUrl += "&output=" + options.googleResultType;

    $.ajax(
    {
        url: feedsUrl,
        dataType: options.datatype,
        crossDomain: options.cross,
        success: function(data) {
            if(data != undefined){
                if(successCallback != undefined)
                    successCallback(data.responseData.feed, options);
                else
                    $(this).gridLoadData(data.responseData.feed, options);
            }
        },
        error: function(jqXHR, textStatus, errorThrown){
            if(onError != undefined)
                onError(jqXHR, textStatus, errorThrown);
        }
    });
}

String.prototype.padLeft = function(n, pad)
{
	t = '';
	if(n>this.length){
		for(i=0;i < n-this.length;i++){
			t+=pad;
		}
	}
	return t+this;
}
String.prototype.padRight = function(n, pad)
{
	t = this;
	if(n>this.length){
		for(i=0;i < n-this.length;i++){
			t+=pad;
		}
	}
	return t;
}

jQuery.fn.iPadNotificationPosition = function() {
    var top = $(window).height() - $(this).find('.wnotificationBoxCont').outerHeight() - 11;
    $(this).css({position: 'absolute', top: top});
};

function disableAngleBrackets(inputId) {
    $('#' + inputId).keypress(function(event){
        var key;
        if (window.event)
            key = window.event.keyCode; //ie
        else
            key = event.which; //firefox

        return key != 60 && key != 62
    });
}

function isFirefox() {
    return navigator.userAgent.indexOf("Firefox") != -1;
}

function isIE8() { 
    return getInternetExplorerVersion() == '8.0';
}


function 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;
}

function isDigit(aChar) {
    myCharCode = aChar.charCodeAt(0);

    if ((myCharCode > 47) && (myCharCode < 58)) {
        return true;
    }

    return false;
}

function isAndroid() {
    var ua = navigator.userAgent.toLowerCase();
    return ua.indexOf("android") > -1;
}

