/**
*
*
*
UTILITY FUNCTIONS
*
*
*
*/

function lpad(str, pad, pad_char) {
	str = str.toString();
	if(typeof(pad_char) == 'undefined') { pad_char = '0'; }
	while(str.length < pad) {
		str = pad_char + str;
	}
	return str;
}

function is_numeric(str) {
	var rex = /^[0-9]+$/;
	return rex.test(str);
}

function daysInMonth(iMonth, iYear)
{
	return 32 - new Date(iYear, iMonth, 32).getDate();
}

Date.prototype.getDOY = function() {
	var onejan = new Date(this.getFullYear(),0,1);
	return Math.ceil((this - onejan) / 86400000);
} 

String.prototype.capitalize = function(){
	return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
};

//case insensitive contains
jQuery.expr[':'].icontains = function(a,i,m){
	return (a.textContent || a.innerText || "").toUpperCase().indexOf(m[3].toUpperCase())>=0;
};




function copy_form(from, to, index, context, ignore) {
	if(typeof(index) == 'undefined') {
		index = 1;	
	}
	if(typeof(ignore) == 'undefined') {
		ignore =[];
	}
	var ign = {};
	for(var i in ignore) {
		ign[ignore[i]] = true;
	}

	if(typeof(context) == 'undefined') { context = document; }
	$("." + from, context).each(function() {
		var classes = $(this).attr("class").split(" ");							
		var field = classes[index]; //second attribute of class is fieldname

		if(typeof(field) != 'undefined' && field != from && field != to && !objPropExists(ign,field) ) {			
			$("." + field + "." + to, context).val($(this).val());
		}
	});
}

jQuery.fn.option = function (value) {
return this.each(function() {
        var sel = $(this)[0];
        for ( var i=0; i<sel.length; i++ )
                if (sel[i].value == value)
                        sel.selectedIndex = i;
        });
};



unix_timestamp = function()
{
	return parseInt(new Date().getTime().toString().substring(0, 10));
}

function diffArrays (A, B) {

  var strA = ":" + A.join("::") + ":";
  var strB = ":" +  B.join(":|:") + ":";

  var reg = new RegExp("(" + strB + ")","gi");

  var strDiff = strA.replace(reg,"").replace(/^:/,"").replace(/:$/,"");

  var arrDiff = strDiff.split("::");

  return arrDiff;
}


function isEmpty(str) {
	var myRe = /^\s*$/;
	return myRe.test(str);	
}

function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function objPropExists(object,property) {
	if(typeof(object) == "undefined") {
		return false;	
	}
	if(typeof(object[property]) != "undefined") {
		return true;	
	}
	return false;
}

function objPropLength(object) {
	var j = 0;
	for(var i in object) {
		j++;
	}
	return j;
}

 
function splitHash(hash) {
	var params = {}
	var hash_split = hash.replace('#','').split('&');
	for(var i in hash_split) {
		var keyval = hash_split[i].split('=');
		params[keyval[0]] = keyval[1];
	}
	return params;
}

function ajaxUpload(field, types)
{
    // this is just an example of checking file extensions
    // if you do not need extension checking, remove 
    // everything down to line
    // upload_field.form.submit();
	upload_field = document.getElementById(field);
	if(types == 'images') {
		var re_text = /(\.png|\.gif|\.jpeg|\.jpg)$/i;	
	}else if(types == 'zip') {
		var re_text = /\.zip$/i;	
	}
	else {
		var re_text = /.*/i;	
	}

    //
    var filename = upload_field.value;

    /* Checking file type */
    if (!filename.match(re_text))
    {
        alert("File does not have a supported extension");
        upload_field.form.reset();
        return false;
    }

    upload_field.form.submit();
	$("#" + field + "_status").html('<img src="/includes/js/ajax-loader.gif"/> Uploading file...');
    //document.getElementById('upload_status').value = "uploading file...";
    //upload_field.disabled = true;
    return false;
}

function rand( min, max ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Leslie Hoare
    // +   bugfixed by: Onno Marsman
    // *     example 1: rand(1, 1);
    // *     returns 1: 1
    var argc = arguments.length;
    if (argc == 0) {
        min = 0;
        max = 2147483647;
    } else if (argc == 1) {
        throw new Error('Warning: rand() expects exactly 2 parameters, 1 given');
    }
    return Math.floor(Math.random() * (max - min + 1)) + min;
}


function clearFields(className) {
	$("."+ className).each(function() {
		//var id = $(this).attr("id");
			$(this).val('');
		
		} );
}

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

function constructQueryString() {
		if(arguments.length == 1 && typeof(arguments[0]) == "object") {
			arguments = arguments[0];
		}
		var qs = 'function='+arguments[0];
		for(i = 0; i < arguments.length-1; i++) {
			qs += '\&arg_' + i + '=' + encodeURIComponent(arguments[i+1]);
		}
		return qs;
}

function array_append(arr,val){
	/*if(typeof(val) == "object") {
		for(i = 0; i < val.length; i ++) {
			arr[arr.length+i] = val[i];
		}
	}*/
	arr[arr.length]=val;
}

jQuery.fn.option = function (value) {
return this.each(function() {
        var sel = $(this)[0];
        for ( var i=0; i<sel.length; i++ )
                if (sel[i].value == value)
                        sel.selectedIndex = i;
        });
};


jQuery.fn.getOption = function() {
	var a;
	this.each(function() {		
		if (this.tagName == 'SELECT') {
			var selectElement = this;
			a = selectElement.options[selectElement.options.selectedIndex].text;
		}			
	});
	return a;	
}

//add >= and <= to selectors
$.extend($.expr[':'],{
	egt: function (a, i, m) {
		return i >=m[3]-0;
	},
	elt: function (a, i, m) {
		return i <=m[3]-0;
	}
});

jQuery.fn.tag = function() {
  return this[0] ? this[0].tagName.toLowerCase() : null;
};

function multiply_arrays() {
	//check that arguments are arrays
	if(arguments.length == 1) {
		arguments = arguments[0];
	}
	
	var i = 0;
	var total = 1;
	while(i < arguments.length) {
		total = total * arguments[i].length;
		i++;
	}
	var multarr = new Array(total);
	var startarr = [0];
	var lastlen = total;
	i = 0;
	while(i < arguments.length) {
		ret = do_multiply(arguments[i],multarr,startarr,lastlen);
		startarr = ret.startarr;
		lastlen = ret.lastlen;
		i++;
	}
	return multarr;
}

function do_multiply(args, multarr, startarr, lastlen) {
	var argslen = args.length;
	var bucketlen = lastlen / argslen;

	var returnstarts = [];
	var j = 0;
	while(j < startarr.length) {
		bucketcount = 0;
		argsindex = 0;
		returnstarts.push(startarr[j]);
		for(i = startarr[j]; i < startarr[j] + lastlen; i++) {
			if(!multarr[i]) { multarr[i] = []; }
			
			multarr[i].push(args[argsindex]);
			
			bucketcount++;
			if(bucketcount == bucketlen) {
				if(i+1 < multarr.length && i+1 != startarr[j+1]) { 
					returnstarts.push(i+1);
				}
				argsindex++;
				bucketcount = 0;
			}
		}
		j++;
	}
	
	return { startarr: returnstarts, lastlen: bucketlen };
	
}


function URLEncode (clearString) {
  var output = '';
  var x = 0;
  
  if (clearString != null &&
	  typeof(clearString) != 'undefined') {
  	clearString = clearString.toString();
  } else {
  	return false;
  }
  
  var regex = /(^[a-zA-Z0-9_.]*)/;
  while (x < clearString.length) {
    var match = regex.exec(clearString.substr(x));
    if (match != null && match.length > 1 && match[1] != '') {
    	output += match[1];
      x += match[1].length;
    } else {
      if (clearString[x] == ' ')
        output += '+';
      else {
        var charCode = clearString.charCodeAt(x);
        var hexVal = charCode.toString(16);
        output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
      }
      x++;
    }
  }
  return output;
}


function htmlentities (string, quote_style) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: nobbler
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: get_html_translation_table
    // *     example 1: htmlentities('Kevin & van Zonneveld');
    // *     returns 1: 'Kevin &amp; van Zonneveld'
 
    var histogram = {}, symbol = '', tmp_str = '', i = 0;
    tmp_str = string.toString();
    
    if (false === (histogram = get_html_translation_table('HTML_ENTITIES', quote_style))) {
        return false;
    }
    
    for (symbol in histogram) {
        entity = histogram[symbol];
        tmp_str = tmp_str.split(symbol).join(entity);
    }
    
    return tmp_str;
}

function get_html_translation_table(table, quote_style) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: noname
    // %          note: It has been decided that we're not going to add global
    // %          note: dependencies to php.js. Meaning the constants are not
    // %          note: real constants, but strings instead. integers are also supported if someone
    // %          note: chooses to create the constants themselves.
    // %          note: Table from http://www.the-art-of-web.com/html/character-codes/
    // *     example 1: get_html_translation_table('HTML_SPECIALCHARS');
    // *     returns 1: {'"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}
    
    var entities = {}, histogram = {}, decimal = 0, symbol = '';
    var constMappingTable = {}, constMappingQuoteStyle = {};
    var useTable = {}, useQuoteStyle = {};
    
    useTable      = (table ? table.toUpperCase() : 'HTML_SPECIALCHARS');
    useQuoteStyle = (quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT');
    
    // Translate arguments
    constMappingTable[0]      = 'HTML_SPECIALCHARS';
    constMappingTable[1]      = 'HTML_ENTITIES';
    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
    constMappingQuoteStyle[2] = 'ENT_COMPAT';
    constMappingQuoteStyle[3] = 'ENT_QUOTES';
    
    // Map numbers to strings for compatibilty with PHP constants
    if (!isNaN(useTable)) {
        useTable = constMappingTable[useTable];
    }
    if (!isNaN(useQuoteStyle)) {
        useQuoteStyle = constMappingQuoteStyle[useQuoteStyle];
    }
    
    if (useTable == 'HTML_SPECIALCHARS') {
        // ascii decimals for better compatibility
        entities['38'] = '&amp;';
        entities['60'] = '&lt;';
        entities['62'] = '&gt;';
    } else if (useTable == 'HTML_ENTITIES') {
        // ascii decimals for better compatibility
      entities['38'] = '&amp;';
      entities['60'] = '&lt;';
      entities['62'] = '&gt;';
      entities['160'] = '&nbsp;';
      entities['161'] = '&iexcl;';
      entities['162'] = '&cent;';
      entities['163'] = '&pound;';
      entities['164'] = '&curren;';
      entities['165'] = '&yen;';
      entities['166'] = '&brvbar;';
      entities['167'] = '&sect;';
      entities['168'] = '&uml;';
      entities['169'] = '&copy;';
      entities['170'] = '&ordf;';
      entities['171'] = '&laquo;';
      entities['172'] = '&not;';
      entities['173'] = '&shy;';
      entities['174'] = '&reg;';
      entities['175'] = '&macr;';
      entities['176'] = '&deg;';
      entities['177'] = '&plusmn;';
      entities['178'] = '&sup2;';
      entities['179'] = '&sup3;';
      entities['180'] = '&acute;';
      entities['181'] = '&micro;';
      entities['182'] = '&para;';
      entities['183'] = '&middot;';
      entities['184'] = '&cedil;';
      entities['185'] = '&sup1;';
      entities['186'] = '&ordm;';
      entities['187'] = '&raquo;';
      entities['188'] = '&frac14;';
      entities['189'] = '&frac12;';
      entities['190'] = '&frac34;';
      entities['191'] = '&iquest;';
      entities['192'] = '&Agrave;';
      entities['193'] = '&Aacute;';
      entities['194'] = '&Acirc;';
      entities['195'] = '&Atilde;';
      entities['196'] = '&Auml;';
      entities['197'] = '&Aring;';
      entities['198'] = '&AElig;';
      entities['199'] = '&Ccedil;';
      entities['200'] = '&Egrave;';
      entities['201'] = '&Eacute;';
      entities['202'] = '&Ecirc;';
      entities['203'] = '&Euml;';
      entities['204'] = '&Igrave;';
      entities['205'] = '&Iacute;';
      entities['206'] = '&Icirc;';
      entities['207'] = '&Iuml;';
      entities['208'] = '&ETH;';
      entities['209'] = '&Ntilde;';
      entities['210'] = '&Ograve;';
      entities['211'] = '&Oacute;';
      entities['212'] = '&Ocirc;';
      entities['213'] = '&Otilde;';
      entities['214'] = '&Ouml;';
      entities['215'] = '&times;';
      entities['216'] = '&Oslash;';
      entities['217'] = '&Ugrave;';
      entities['218'] = '&Uacute;';
      entities['219'] = '&Ucirc;';
      entities['220'] = '&Uuml;';
      entities['221'] = '&Yacute;';
      entities['222'] = '&THORN;';
      entities['223'] = '&szlig;';
      entities['224'] = '&agrave;';
      entities['225'] = '&aacute;';
      entities['226'] = '&acirc;';
      entities['227'] = '&atilde;';
      entities['228'] = '&auml;';
      entities['229'] = '&aring;';
      entities['230'] = '&aelig;';
      entities['231'] = '&ccedil;';
      entities['232'] = '&egrave;';
      entities['233'] = '&eacute;';
      entities['234'] = '&ecirc;';
      entities['235'] = '&euml;';
      entities['236'] = '&igrave;';
      entities['237'] = '&iacute;';
      entities['238'] = '&icirc;';
      entities['239'] = '&iuml;';
      entities['240'] = '&eth;';
      entities['241'] = '&ntilde;';
      entities['242'] = '&ograve;';
      entities['243'] = '&oacute;';
      entities['244'] = '&ocirc;';
      entities['245'] = '&otilde;';
      entities['246'] = '&ouml;';
      entities['247'] = '&divide;';
      entities['248'] = '&oslash;';
      entities['249'] = '&ugrave;';
      entities['250'] = '&uacute;';
      entities['251'] = '&ucirc;';
      entities['252'] = '&uuml;';
      entities['253'] = '&yacute;';
      entities['254'] = '&thorn;';
      entities['255'] = '&yuml;';
    } else {
        throw Error("Table: "+useTable+' not supported');
        return false;
    }
    
    if (useQuoteStyle != 'ENT_NOQUOTES') {
        entities['34'] = '&quot;';
    }
    
    if (useQuoteStyle == 'ENT_QUOTES') {
        entities['39'] = '&#039;';
    }
    
    // ascii decimals to real symbols
    for (decimal in entities) {
        symbol = String.fromCharCode(decimal)
        histogram[symbol] = entities[decimal];
    }
    
    return histogram;
}
/*
jQuery.fn.limitMaxlength = function(options){

	var settings = jQuery.extend({
		attribute: "maxlength",
		onLimit: function(){},
		onEdit: function(){}
	}, options);

	// Event handler to limit the textarea
	var onEdit = function(){
		var textarea = jQuery(this);
		var maxlength = parseInt(textarea.attr(settings.attribute));

		if(textarea.val().length > maxlength){
			textarea.val(textarea.val().substr(0, maxlength));

			// Call the onlimit handler within the scope of the textarea
			jQuery.proxy(settings.onLimit, this)();
		}

		// Call the onEdit handler within the scope of the textarea
		jQuery.proxy(settings.onEdit, this)(maxlength - textarea.val().length);
	}

	this.each(onEdit);

	return this.keyup(onEdit)
				.keydown(onEdit)
				.focus(onEdit)
				.live('input paste', onEdit);
}*/

