// Language Config

var GlobalLangArr = new Array();

GlobalLangArr[4]  = 'SA Arabic (101)';                  // Arabic
GlobalLangArr[16] = 'BR Portuguese (Brazilian ABNT)';   // Brazilian
GlobalLangArr[15] = 'CN Chinese Simpl. Pinyin';         // Chinese
GlobalLangArr[23] = 'GB United Kingdom';              // English
GlobalLangArr[28] = 'FR French';                        // French
GlobalLangArr[41] = 'IT Italian';                       // Italian
GlobalLangArr[64] = 'PT Portuguese';                    // Portuguese
GlobalLangArr[67] = 'RU Russian';                       // Russian
GlobalLangArr[74] = 'ES Spanish';                       // Spanish
GlobalLangArr[83] = 'TR Turkish F';                     // Turkish
GlobalLangArr[26] = 'TL Tagalog - Tausug';              // Filipino
GlobalLangArr[31] = 'DE German';                        // German
GlobalLangArr[42] = 'JP Japanese';                      // Japanese

// Js Max Textarea Limit Config

textAreaMaxLength = 140;

///////////////////// Common Functions

function myclone(obj) {
	try {return eval(uneval(obj));} catch(e){}//FF only! This is faster than looping

	function c(o) {
		for (var i in o) {
			this[i] = o[i];
		}
	}
	return new c(obj);
}

function doAjaxPost(method, data, callBackFx, type)
{
	$.post(ajaxCtrlFx+method+"/", data, callBackFx, type);
	return false;
}

function validateEmail(email_add){
    if(email_add == ''){
        return false;
    }
    var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
    if(reg.test(email_add) == false) {
        return false;
    } else {
        return true;
    }
}

function RedirectUrl(url){
  window.location = url;
  return false;
}

function count(array)
{
    var c = 0;
    for(i in array) // in returns key, not object
    if(array[i] != undefined)
    c++;

    return c;
}

function isArray(obj) {
    return obj.constructor == Array;
}

function getTime(){
	var currentTime = new Date()
	var hours = currentTime.getHours()
	var minutes = currentTime.getMinutes()

	if (minutes < 10)
		minutes = "0" + minutes
	if (hours < 10)
		hours = "0" + hours

	return hours + ":" + minutes;
}

function isImage( image ){
	return (image.indexOf('.jpg') >0 || image.indexOf('.png') >0 || image.indexOf('.gif') >0)
}

function str_replace(search, replace, subject) {
    return subject.split(search).join(replace);
}

function insertLoader(target, loader) {
	if(target == null) return;
	if(loader == null) loader = "#gddLoader"; //default loader id

	$(loader).appendTo(target);
	$(loader).addClass("active")
}

function hideLoader(target) {
    if(target == null) target = "#content #gddLoader";
    if($(target).hasClass("active")) $(target).removeClass("active");
}

function submitOnEnter(target, form) {

    if(target == null || form == null) return false;

    $(target).keypress(function(e){
        if(e.which == 13) {
            $(form).submit();
        }
    });
}

Array.prototype.in_array = function( val ){
	for(var i=0; i < this.length; i++){
		if(this[i] == val) return i;
	}

	return -1;
}

/*
 * COOKIE handling,
 * The following functions pmake it easy to create, get and delete cookies
 */
function setCookie( name, value, date, path)
{
	if(!date){
		var exdate=new Date();
		exdate.setDate(exdate.getDate()+1);
		date = exdate.toGMTString();
	}

	var ck = name+"="+escape(value)+";expires="+date;
	if(path) ck+=";path="+path;

	try{document.cookie=ck;}catch(e){
		if(window.console) console.log('Cookie could not be written : ',name, value, date, path)
	}
}

function getCookie( cookie_name ){
	if(document.cookie.length>0)
	{
		var c_start=document.cookie.indexOf(cookie_name + "=");
		if (c_start!=-1)
		{
			c_start=c_start + cookie_name.length+1;
			var c_end=document.cookie.indexOf(";",c_start);
			if (c_end==-1) c_end=document.cookie.length;
			return unescape(document.cookie.substring(c_start,c_end));
		}
	}
	return '';
}

function deleteCookie( cookie_name ){

	var exdate=new Date();
	exdate.setDate(exdate.getDate()-7);
	var date = exdate.toGMTString();

	document.cookie=cookie_name+"=;expires="+date;
}

/*
 * TimeoutMessage displays a message for a predetermined amount of time.
 * Use the constructor to specify which DOM object it should be linked, and what the default timeout should be
 * The timeout can be changed everytime show is called as well
 *
 * show	 : Display a message. (Optional default_timeout: set the number of seconds after which the message is hidden)
 * clear : clear the message timer and hide the message. This will clear the text inside message_dom
 * hide  : hide the message manually. (Optional clear) Set to true to clear the message.
 */
function TimeoutMessage(message_dom, default_timeout){
	this.default_timeout = default_timeout;
	this.lastTimeoutObj = null;
	this.message_dom = message_dom;

	this.show = function(message, timeout){
		this.clear(true);
		var obj = this.message_dom;
		if(!obj) return false;

		$(obj).text(message).show('normal'); //addClass("active");

		var that = this;
		this.lastTimeoutObj = setTimeout(function(){
			that.hide(true);
		}, timeout || this.default_timeout);
	}

	this.clear = function(){
		$(this.message_dom).text('');
		clearTimeout(this.lastTimeout);
	}

	this.hide = function( clear ){
		var obj = $(this.message_dom);
		if(!obj) return false;

		obj.hide('normal');
		obj.removeClass('active');
		if(clear) obj.text('');
	}
}

/*
 * This function looks for .loadingSignal and activates it. If .loadingSignal doesn't exist, it is inserted
 * @param style (Optional) - Inline styles applied to .loadingSignal
 */
$.fn.showLoader = function ( style ) {
	var loading_html = '<span class="loadingSignal">Loading</span>';
	this.each(function(){
		if($(this).find('.loadingSignal').length < 1) $(this).append(loading_html);
		var ls = $(this).find('.loadingSignal');
		if(style && style.length > 0) ls.attr('style',style);
		ls.addClass('active');
	})
}

/*
 * Hides .loadingSignal
 */
$.fn.hideLoader = function ( style ) {
	this.each(function(){
		if($(this).find('.loadingSignal').length < 1) return;
		$(this).find('.loadingSignal').removeClass('active');
	})
}

/*
 * This function sets up AJAX based pagination into the given DOM selection.
 * It will also work for multiple DOMs
 * @param int total - The total count of all items
 * @param int page - The current page number (0 is valid)
 * @param fn page_select_callback - The callback to call when a page number is clicked. It should take two parameters: page, parent
 * @param json options - (Optional) A JSON object to override default params
 */
jQuery.fn.easyPagination = function ( total, page, page_select_callback, options ) {
	if( (!options || options.length < 1) && (!PageConfig || PageConfig.length < 1) ) throw 'Options and/or PageConfig are not defined';
	if( !$(this).pagination) throw 'Jquery Pagination not loaded';
	if(options == null || options == undefined) options = PageConfig;
	else {
		for(var i in options) PageConfig[i] = options[i]
	}

	this.each(function(){
		if(!total || total <= options.items_per_page) {
			$(this).empty();
			return;
		}
		initPagi = 0

		$(this).pagination(total, {
			items_per_page: options.items_per_page,
			num_edge_entries: options.num_edge_entries,
			num_display_entries: options.num_display_entries,
			next_text : options.next_text,
			prev_text : options.prev_text,
			current_page : (page)?page:0,
			callback: function(page, parent){if(initPagi > 0) return page_select_callback(page, parent);return false;}
		});

		initPagi = 1;
	});
}

/*
 *This function implements the maxlength property on a textarea.
 *
 *@params maxlength : The maximum number of chars allowed
 */
jQuery.fn.maxLength = function( maxlength ){
	this.each(function(){
		var me = $(this);
		if(me.get(0).tagName != 'TEXTAREA') return;

		me.attr('maxlength',maxlength);
		me.keydown( function(e){
			var exclude_list = {32:'',9:''};
			//If delete or backspace, return true
			if(e.keyCode > 0 && e.keyCode <= 46 && !(e.keyCode in exclude_list)) return true;
			return ($(this).val().length < $(this).attr('maxlength'));
		});
	});
}

jQuery.fn.clearForm = function( clear_hidden_fields ){
	$(':input',this)
	.not(':button, :submit, :reset ' + ((clear_hidden_fields)?', :hidden':'') )
	.val('')
	.removeAttr('checked')
	.removeAttr('selected');
}

$.fn.listHandlers = function(events, outputFunction) {
    return this.each(function(i){
        var elem = this,
            dEvents = $(this).data('events');
        if (!dEvents) {return;}
        $.each(dEvents, function(name, handler){
            if((new RegExp('^(' + (events === '*' ? '.+' : events.replace(',','|').replace(/^on/i,'')) + ')$' ,'i')).test(name)) {
               $.each(handler, function(i,handler){
                   outputFunction(elem, '\n' + i + ': [' + name + '] : ' + handler );
               });
           }
        });
    });
};

/*
 * JQUERY PLUGIN to bind a handler only once for an event. Works only for events with namespaces
 * The function checks the namespace of the event
 * NOTE : Anonymous functions can be rebound many times, as they are a different object everytime they are created
 * TODO : Check for same function definitions, so a same function cannot be bound to an event, even if no namepsace is used.
 */
$.fn.bindEx = function(event, handler) {
	return this.each(function(index){
		var evt = event.substring(0,event.indexOf('.'));
		var ns	= event.substring(event.indexOf('.')+1);
		var obj = ($(this).data != undefined && $(this).data('events') != undefined)? $(this).data('events')[evt] : null;
		var found = false;

		if(obj != null){
			for(var i=0; i < obj.length; i++){
				//console.log(i, parseInt(i), isNaN(parseInt(i)), obj, obj[0], ns, found);
				if(isNaN(parseInt(i)) || obj[i].type.length < 1) continue;
				if(obj[i].type.length > 0 && obj[i].type == ns){
					found = true;
					break;
				}
			}
		}

		if(!found) $(this).bind(event,handler);
	});
};

var searchGlobal = {
    doSearch : function(url) {
		if($("#txtSearch").val().trim() == "" || $("#txtSearch").val() == $("#helper_txtSearch").val()) return false;

		//e.target.form.submit(); //Remove this later
		//var url = e.target.form.action;
		var search = $("#txtSearch").val().trim();
		var opts = {type : 'post',data : {q:search, btnSearch:''}};
		loadPage(url+'start/q:'+search,opts);

        return false;
    }
};

function commonInit(evt, data){

	$('textarea[maxlength]').each(function(){
		$(this).maxLength($(this).attr('maxlength')); //Initialize all textboxes that have maxlength defined
	});

	var submit = function(e){
		if($('#txtSearch').val().length < 3) return false;
        searchGlobal.doSearch( e.target.form.action );
        e.preventDefault();
        return false;
	}

	var tinit_val = $('#helper_txtSearch').val();
	$('#txtSearch').val(tinit_val);

	/* top search specific handlers*/
	$('#txtSearch').focus(function(){if($(this).val() == tinit_val) $(this).val('')});
	$('#txtSearch').blur(function(){if($(this).val() == '') $(this).val(tinit_val)});
	$('#txtSearch').keydown(function(e){ if(e.keyCode == 13) return submit(e); });
	$("#frmSearchInput #btnSearch").click(function(e) { return submit(e); });

    if($('#txtEmail').length > 0){
        var srchHlpr_val = $('#loginTxtHelper').val();
        $('#txtEmail').focus(function(){if($(this).val() == srchHlpr_val) $(this).val('')});
        $('#txtEmail').blur(function(){if($(this).val() == '') $(this).val(srchHlpr_val)});
    }
}

$(document).ready(commonInit);