/*
  jQuery strings - 0.1a
  http://code.google.com/p/jquery-utils/
  
  (c) Maxime Haineault <haineault@gmail.com>
  http://haineault.com   

  MIT License (http://www.opensource.org/licenses/mit-license.php)

  Implementation of Python3K advanced string formatting
  http://www.python.org/dev/peps/pep-3101/

  Documentation: http://code.google.com/p/jquery-utils/wiki/StringFormat
  
*/
(function(){
    var conversion = {
        // tries to translate any objects type into string gracefully
        __repr: function(i){
            switch(this.__getType(i)) {
                case 'array':case 'date':case 'number':
                    return i.toString();
                case 'object': 
                    var o = [];
                    for (x=0; x<i.length; i++) { o.push(i+': '+ this.__repr(i[x])); }
                    return o.join(', ');
                case 'string': 
                    return i;
                default: 
                    return i;
            }
        },
        // like typeof but less vague
        __getType: function(i) {
            if (!i || !i.constructor) { return typeof(i); }
            var match = i.constructor.toString().match(/Array|Number|String|Object|Date/);
            return match && match[0].toLowerCase() || typeof(i);
        },
        //+ Jonas Raoni Soares Silva
        //@ http://jsfromhell.com/string/pad [v1.0]
        __pad: function(str, l, s, t){
            return s || (s = " "), (l -= str.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
                + 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
                + str + s.substr(0, l - t) : str;
        },
        __getInput: function(arg, args) {
            var key = arg.getKey();
            switch(this.__getType(args)){
                case 'object': 
                    if (typeof(args[key]) != 'undefined') {
                        if (conversion.__getType(args[key]) == 'array') {
                            return arg.getFormat().match(/\.\*/) && args[key][1] || args[key];
                        }
                        return args[key];
                    }
                    else {
                        // TODO: try by numerical index
                    }
                break;
                case 'array': 
                    key = parseInt(key, 10);
                    if (arg.getFormat().match(/\.\*/) && typeof(args[key+1]) != 'undefined') return args[key+1];
                    else if (typeof(args[key]) != 'undefined') return args[key];
                    else return key;
                break;
            }
            return '{'+key+'}';
        },
        __formatToken: function(token, args) {
            var arg   = new Argument(token, args);
            return conversion[arg.getFormat().slice(-1)](this.__getInput(arg, args), arg);
        },

        // Signed integer decimal.
        d: function(input, arg){
            var o = parseInt(input, 10); // enforce base 10
            var p = arg.getPaddingLength();
            if (p) return this.__pad(o.toString(), p, arg.getPaddingString(), 0);
            else return o;
        },
        // Signed integer decimal.
        i: function(input, args){ 
            return this.d(input, args);
        },
        // Unsigned octal
        o: function(input, arg){ 
            var o = input.toString(8);
            if (arg.isAlternate()) o = this.__pad(o, o.length+1, '0', 0); 
            return this.__pad(o, arg.getPaddingLength(), arg.getPaddingString(), 0);
        },
        // Unsigned decimal
        u: function(input, args) {
            return Math.abs(this.d(input, args));
        },
        // Unsigned hexadecimal (lowercase)
        x: function(input, arg){
            var o = parseInt(input, 10).toString(16);
            o = this.__pad(o, arg.getPaddingLength(), arg.getPaddingString(),0);
            return (arg.isAlternate())? '0x'+o: o;
        },
        // Unsigned hexadecimal (uppercase)
        X: function(input, arg){
            return this.x(input, arg).toUpperCase();
        },
        // Floating point exponential format (lowercase)
        e: function(input, arg){
            return parseFloat(input, 10).toExponential(arg.getPrecision());
        },
        // Floating point exponential format (uppercase)
        E: function(input, arg){
            return this.e(input, arg).toUpperCase();
        },
        // Floating point decimal format
        f: function(input, arg){
            return this.__pad(parseFloat(input, 10).toFixed(arg.getPrecision()), arg.getPaddingLength(), arg.getPaddingString(),0);
        },
        // Floating point decimal format (alias)
        F: function(input, args){
            return this.f(input, args);
        },
        // Floating point format. Uses exponential format if exponent is greater than -4 or less than precision, decimal format otherwise
        g: function(input, arg){
            var o = parseFloat(input, 10);
            return (o.toString().length > 6) ? Math.round(o.toExponential(arg.getPrecision())): o;
        },
        // Floating point format. Uses exponential format if exponent is greater than -4 or less than precision, decimal format otherwise
        G: function(input, args){
            return this.g(input, args);
        },
        // Single character (accepts integer or single character string). 	
        c: function(input, args) {
            var match = input.match(/\w|\d/);
            return match && match[0] || '';
        },
        // String (converts any JavaScript object to anotated format)
        r: function(input, args) {
            return this.__repr(input);
        },
        // String (converts any JavaScript object using object.toString())
        s: function(input, args) {
            return input.toString && input.toString() || ''+input;
        }
    };

    var Argument = function(arg, args) {
        this.__arg  = arg;
        this.__args = args;
        this.__max_precision = parseFloat('1.'+ (new Array(32)).join('1'), 10).toString().length-3;
        this.__def_precision = 6;
        this.getString = function(){
            return this.__arg;
        };
        this.getKey = function(){
            return this.__arg.split(':')[0];
        };
        this.getFormat = function(){
            var match = this.getString().split(':');
            return (match && match[1])? match[1]: 's';
        };
        this.getPrecision = function(){
            var match = this.getFormat().match(/\.(\d+|\*)/g);
            if (!match) return this.__def_precision;
            else {
                match = match[0].slice(1);
                if (match != '*') return parseInt(match, 10);
                else if(conversion.__getType(this.__args) == 'array') {
                    return this.__args[1] && this.__args[0] || this.__def_precision;
                }
                else if(conversion.__getType(this.__args) == 'object') {
                    return this.__args[this.getKey()] && this.__args[this.getKey()][0] || this.__def_precision;
                }
                else return this.__def_precision;
            }
        };
        this.getPaddingLength = function(){
            if (this.isAlternate()) {
                var match = this.getString().match(/0?#0?(\d+)/);
                if (match && match[1]) return parseInt(match[1], 10);
            }
            var match = this.getString().match(/(0|\.)(\d+|\*)/g)
            return match && parseInt(match[0].slice(1), 10) || 0;
        };
        this.getPaddingString = function(){
            var o = '';
            if (this.isAlternate()) o = ' ';
            // 0 take precedence on alternate format
            if (this.getFormat().match(/#0|0#|^0|\.\d+/)) o = '0'; 
            return o;
        };
        this.getFlags = function(){
            var match = this.getString().match(/^(0|\#|\-|\+|\s)+/);
            return match && match[0].split('') || [];
        };
        this.isAlternate = function() {
            return !!this.getFormat().match(/^0?#/);
        };
    };

    var arguments2Array = function(args, shift) {
        var shift = shift || 0;
        var o = [];
        for (l=args.length, x=shift-1; x<l;x++) o.push(args[x]);
        return o;
    }

    var format = function(str, args) {
        var end    = 0;
        var start  = 0;
        var match  = false;
        var buffer = [];
        var token  = '';
        var args   = (typeof(arguments[1]) != 'object')? arguments2Array(arguments, 2): args || [];
        var tmp    = str.split('');
        for(start=0; start < tmp.length; start++) {
            if (tmp[start] == '{' && tmp[start+1] !='{') {
                end   = str.indexOf('}', start);
                token = tmp.slice(start+1, end).join('');
                buffer.push(conversion.__formatToken(token, args));
            }
            else if (start > end || buffer.length < 1)  buffer.push(tmp[start]);
        }
        return (buffer.length > 1)? buffer.join(''): buffer[0];
    };

    $.extend({format: format, strConversion: conversion});
})();
;/*
 * Metadata - jQuery plugin for parsing metadata from elements
 *
 * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.metadata.js 3640 2007-10-11 18:34:38Z pmclanahan $
 *
 */

/**
 * Sets the type of metadata to use. Metadata is encoded in JSON, and each property
 * in the JSON will become a property of the element itself.
 *
 * There are three supported types of metadata storage:
 *
 *   attr:  Inside an attribute. The name parameter indicates *which* attribute.
 *          
 *   class: Inside the class attribute, wrapped in curly braces: { }
 *   
 *   elem:  Inside a child element (e.g. a script tag). The
 *          name parameter indicates *which* element.
 *          
 * The metadata for an element is loaded the first time the element is accessed via jQuery.
 *
 * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
 * matched by expr, then redefine the metadata type and run another $(expr) for other elements.
 * 
 * @name $.metadata.setType
 *
 * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
 * @before $.metadata.setType("class")
 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
 * @desc Reads metadata from the class attribute
 * 
 * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
 * @before $.metadata.setType("attr", "data")
 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
 * @desc Reads metadata from a "data" attribute
 * 
 * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
 * @before $.metadata.setType("elem", "script")
 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
 * @desc Reads metadata from a nested script element
 * 
 * @param String type The encoding type
 * @param String name The name of the attribute to be used to get metadata (optional)
 * @cat Plugins/Metadata
 * @descr Sets the type of encoding to be used when loading metadata for the first time
 * @type undefined
 * @see metadata()
 */

(function($) {

$.extend({
	metadata : {
		defaults : {
			type: 'class',
			name: 'metadata',
			cre: /({.*})/,
			single: 'metadata'
		},
		setType: function( type, name ){
			this.defaults.type = type;
			this.defaults.name = name;
		},
		get: function( elem, opts ){
			var settings = $.extend({},this.defaults,opts);
			// check for empty string in single property
			if ( !settings.single.length ) settings.single = 'metadata';
			
			var data = $.data(elem, settings.single);
			// returned cached data if it already exists
			if ( data ) return data;
			
			data = "{}";
			
			if ( settings.type == "class" ) {
				var m = settings.cre.exec( elem.className );
				if ( m )
					data = m[1];
			} else if ( settings.type == "elem" ) {
				if( !elem.getElementsByTagName ) return;
				var e = elem.getElementsByTagName(settings.name);
				if ( e.length )
					data = $.trim(e[0].innerHTML);
			} else if ( elem.getAttribute != undefined ) {
				var attr = elem.getAttribute( settings.name );
				if ( attr )
					data = attr;
			}
			
			if ( data.indexOf( '{' ) <0 )
			data = "{" + data + "}";
			
			data = eval("(" + data + ")");
			
			$.data( elem, settings.single, data );
			return data;
		}
	}
});

/**
 * Returns the metadata object for the first member of the jQuery object.
 *
 * @name metadata
 * @descr Returns element's metadata object
 * @param Object opts An object contianing settings to override the defaults
 * @type jQuery
 * @cat Plugins/Metadata
 */
$.fn.metadata = function( opts ){
	return $.metadata.get( this[0], opts );
};

})(jQuery);;/* 
 * jTemplates 0.7.0 (http://jtemplates.tpython.com)
 * Copyright (c) 2007-2008 Tomasz Gloc (http://www.tpython.com)
 * Please do not remove or modify above line. Thanks.
 * 
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Id: $Id: jquery-jtemplates_uncompressed.js 161 2008-05-22 17:31:45Z tom $
 */
 
 /**
 * @fileOverview Template engine in JavaScript.
 * @name jTemplates
 * @author Tomasz Gloc
 * @date $Date: 2008-05-22 19:31:45 +0200 (Cz, 22 maj 2008) $
 */

//#####>@IGNORE
 
/** @ignore */
function log(arg) {
	if(window.console) {
		console.log.apply(document, arguments);
	}
};

//#####<@IGNORE


if(window.jQuery && !window.jQuery.createTemplate) {(function() {
	
	/**
	 * [abstract]
	 * @name BaseNode
	 * @class Abstract node. [abstract]
	 */
	
	/**
	 * Process node and get the html string. [abstract]
	 * @name get
	 * @function
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 * @memberOf BaseNode
	 */
	
	/**
	 * [abstract]
	 * @name BaseArray
	 * @inherits BaseNode
	 * @class Abstract array/collection. [abstract]
	 */
	
	/**
	 * Add node 'e' to array.
	 * @name push
	 * @function
	 * @param {BaseNode} e a node
	 * @memberOf BaseArray
	 */
	
	/**
	 * See (http://jquery.com/).
	 * @name jQuery
	 * @class jQuery Library (http://jquery.com/)
	 */
	
	/**
	 * See (http://jquery.com/)
	 * @name fn
	 * @class jQuery Library (http://jquery.com/)
	 * @memberOf jQuery
	 */
	
	
	/**
	 * Create new template from string s.
	 * @constructor
	 * @param {string} s A template string (like: "Text: {$T.txt}.").
	 * @param {array} [includes] Array of included templates.
	 * @param {object} [settings] Settings.
	 * @config {boolean} [disallow_functions] Do not allow use function in data (default: true).
	 * @config {boolean} [filter_data] Enable filter data using escapeHTML (default: true).
	 * @config {boolean} [filter_params] Enable filter parameters using escapeHTML (default: false).
	 * @config {boolean} [runnable_functions] Automatically run function (from data) inside {} [default: false]. 
	 * @inherits BaseNode
	 * @class A template or multitemplate.
	 */
	var Template = function(s, includes, settings) {
		this._tree = [];
		this._param = {};
		this._includes = null;
		this._templates = {};
		this._templates_code = {};
		
		this.settings = jQuery.extend({
			disallow_functions: false,
			filter_data: true,
			filter_params: false,
			runnable_functions: false,
			clone_data: true,
			clone_params: true
		}, settings);
		
		this.splitTemplates(s, includes);
		
		if(s) {
			this.setTemplate(this._templates_code['MAIN'], includes, this.settings);
		}
		
		this._templates_code = null;
	};
	
	/**
	 * jTemplates version
	 * @type string
	 */
	Template.prototype.version = '0.7.0';
	
	/**
	 * Split multitemplate into multiple templates.
	 * @param {string} s A template string (like: "Text: {$T.txt}.").
	 * @param {array} includes Array of included templates.
	 */
	Template.prototype.splitTemplates = function(s, includes) {
		var reg = /\{#template *(\w*?)( .*)*\}/g;
		var iter, tname, se;
		var lastIndex = null;
		
		var _template_settings = [];
		
		while((iter = reg.exec(s)) != null) {
			lastIndex = reg.lastIndex;
			tname = iter[1];
			se = s.indexOf('{#/template ' + tname + '}', lastIndex);
			if(se == -1) {
				throw new Error('jTemplates: Template "' + tname + '" is not closed.');
			}
			this._templates_code[tname] = s.substring(lastIndex, se);
			_template_settings[tname] = TemplateUtils.optionToObject(iter[2]);
		}
		if(lastIndex === null) {
			this._templates_code['MAIN'] = s;
			return;
		}
		
		for(var i in this._templates_code) {
			if(i != 'MAIN') {
				this._templates[i] = new Template();
			}
		}
		for(var i in this._templates_code) {
			if(i != 'MAIN') {
				this._templates[i].setTemplate(this._templates_code[i], jQuery.extend({}, includes || {}, this._templates || {}), jQuery.extend({}, this.settings, _template_settings[i]));
				this._templates_code[i] = null;
			}
		}
	};
	
	/**
	 * Parse template. (should be template, not multitemplate).
	 * @param {string} s A template string (like: "Text: {$T.txt}.").
	 * @param {array} includes Array of included templates.
	 */
	Template.prototype.setTemplate = function(s, includes, settings) {
		if(s == undefined) {
			this._tree.push(new TextNode('', 1));
			return;
		}
		s = s.replace(/[\n\r]/g, '');
		s = s.replace(/\{\*.*?\*\}/g, '');
		this._includes = jQuery.extend({}, this._templates || {}, includes || {});
		this.settings = new Object(settings);
		var node = this._tree;
		var op = s.match(/\{#.*?\}/g);
		var ss = 0, se = 0;
		var e;
		var literalMode = 0;
		var elseif_level = 0;
		
		for(var i=0, l=(op)?(op.length):(0); i<l; ++i) {
			if(literalMode) {
				se = s.indexOf('{#/literal}');
				if(se == -1) {
					throw new Error("jTemplates: No end of literal.");
				}
				if(se > ss) {
					node.push(new TextNode(s.substring(ss, se), 1));
				}
				ss = se + 11;
				literalMode = 0;
				i = jQuery.inArray('{#/literal}', op);
				continue;
			}
			se = s.indexOf(op[i], ss);
			if(se > ss) {
				node.push(new TextNode(s.substring(ss, se), literalMode));
			}
			var ppp = op[i].match(/\{#([\w\/]+).*?\}/);
			var op_ = RegExp.$1;
			switch(op_) {
				case 'elseif':
					++elseif_level;
					node.switchToElse();
					//no break
				case 'if':
					e = new opIF(op[i], node);
					node.push(e);
					node = e;
					break;
				case 'else':
					node.switchToElse();
					break;
				case '/if':
					while(elseif_level) {
						node = node.getParent();
						--elseif_level;
					}
					//no break
				case '/for':
				case '/foreach':
					node = node.getParent();
					break;
				case 'foreach':
					e = new opFOREACH(op[i], node);
					node.push(e);
					node = e;
					break;
				case 'for':
					e = opFORFactory(op[i], node);
					node.push(e);
					node = e;
					break;
				case 'include':
					node.push(new Include(op[i], this._includes));
					break;
				case 'param':
					node.push(new UserParam(op[i]));
					break;
				case 'cycle':
					node.push(new Cycle(op[i]));
					break;
				case 'ldelim':
					node.push(new TextNode('{'));
					break;
				case 'rdelim':
					node.push(new TextNode('}'));
					break;
				case 'literal':
					literalMode = 1;
					break;
				case '/literal':
					throw new Error("jTemplates: No begin of literal.");
				default:
					throw new Error('jTemplates: unknown tag ' + op_ + '.');
			}
	
			ss = se + op[i].length;
		}
	
		if(s.length > ss) {
			node.push(new TextNode(s.substr(ss), literalMode));
		}
	};
	
	/**
	 * Process template and get the html string.
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 */
	Template.prototype.get = function(d, param, element, deep) {
		++deep;
		
		var $T = d, _param1, _param2;
		
		if(this.settings.clone_data) {
			$T = TemplateUtils.cloneData(d, {escapeData: (this.settings.filter_data && deep == 1), noFunc: this.settings.disallow_functions});
		}
		
		if(!this.settings.clone_params) {
			_param1 = this._param;
			_param2 = param;
		} else {
			_param1 = TemplateUtils.cloneData(this._param, {escapeData: (this.settings.filter_params), noFunc: false});
			_param2 = TemplateUtils.cloneData(param, {escapeData: (this.settings.filter_params && deep == 1), noFunc: false});
		}
		var $P = jQuery.extend({}, _param1, _param2);
		
		var $Q = element;
		$Q.version = this.version;
	
		var ret = '';
		for(var i=0, l=this._tree.length; i<l; ++i) {
			ret += this._tree[i].get($T, $P, $Q, deep);
		}
		
		--deep;
		return ret;
	};
	
	/**
	 * Set to parameter 'name' value 'value'.
	 * @param {string} name
	 * @param {object} value
	 */
	Template.prototype.setParam = function(name, value) {
		this._param[name] = value;
	};


	/**
	 * Template utilities.
	 * @class Template utilities.
	 */
	TemplateUtils = function() {
	};
	
	/**
	 * Replace chars &, >, <, ", ' with html entities.
	 * To disable function set settings: filter_data=false, filter_params=false
	 * @param {string} string
	 * @return {string}
	 * @static
	 * @memberOf TemplateUtils
	 */
	TemplateUtils.escapeHTML = function(txt) {
		return txt.replace(/&/g,'&amp;').replace(/>/g,'&gt;').replace(/</g,'&lt;').replace(/"/g,'&quot;').replace(/'/g,'&#39;');
	};

	/**
	 * Make a copy od data 'd'. It also filters data (depend on 'filter').
	 * @param {object} d input data
	 * @param {object} filter a filters
	 * @config {boolean} [escapeData] Use escapeHTML on every string.
	 * @config {boolean} [noFunc] Do not allow to use function (throws exception).
	 * @return {object} output data (filtered)
	 * @static
	 * @memberOf TemplateUtils
	 */
	TemplateUtils.cloneData = function(d, filter) {
		if(d == null) {
			return d;
		}
		switch(d.constructor) {
			case Object:
				var o = {};
				for(var i in d) {
					o[i] = TemplateUtils.cloneData(d[i], filter);
				}
				if(!filter.noFunc) {
					o.toString = d.toString;
				}
				return o;
			case Array:
				var o = [];
				for(var i=0,l=d.length; i<l; ++i) {
					o[i] = TemplateUtils.cloneData(d[i], filter);
				}
				return o;
			case String:
				return (filter.escapeData) ? (TemplateUtils.escapeHTML(d)) : (d);
			case Function:
				if(filter.noFunc) {
					throw new Error("jTemplates: Functions are not allowed.");
				}
				//no break
			default:
				return d;
		}
	};
	
	/**
	 * Convert text-based option string to Object
	 * @param {string} optionText text-based option string
	 * @return {Object}
	 * @static
	 * @memberOf TemplateUtils
	 */
	TemplateUtils.optionToObject = function(optionText) {
		if(optionText === null || optionText === undefined) {
			return {};
		}
		
		var o = optionText.split(/[= ]/);
		if(o[0] === '') {
			o.shift();
		}
		
		var obj = {};
		for(var i=0, l=o.length; i<l; i+=2) {
			obj[o[i]] = o[i+1];
		}
		
		return obj;
	};
	
	
	/**
	 * Create a new text node.
	 * @constructor
	 * @param {string} val text string
	 * @param {boolean} literalMode When enable (true) template does not interpret blocks {..}.
	 * @inherits BaseNode
	 * @class All text (block {..}) between controls block {#..}.
	 */
	var TextNode = function(val, literalMode) {
		this._value = val;
		this._literalMode = literalMode;
	};
	
	/**
	 * Get the html string for a text node.
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 */
	TextNode.prototype.get = function(d, param, element, deep) {
		var t = this._value;
		if(!this._literalMode) {
			var $T = d;
			var $P = param;
			var $Q = element;
			t = t.replace(/\{(.*?)\}/g, function(__a0, __a1) {
				var tmp = eval(__a1);
				if(typeof tmp == 'function') {
					var settings = jQuery.data(element, 'jTemplate').settings;
					if(settings.disallow_functions || !settings.runnable_functions) {
						return '';
					} else {
						tmp = tmp($T, $P, $Q);
					}
				}
				return (tmp === undefined) ? ("") : (String(tmp));
			});
		}
		return t;
	};
	
	/**
	 * Create a new conditional node.
	 * @constructor
	 * @param {string} oper content of operator {#..}
	 * @param {object} par parent node
	 * @inherits BaseArray
	 * @class A class represent: {#if}.
	 */
	var opIF = function(oper, par) {
		this._parent = par;
		oper.match(/\{#(?:else)*if (.*?)\}/);
		this._cond = RegExp.$1;
		this._onTrue = [];
		this._onFalse = [];
		this._currentState = this._onTrue;
	};
	
	/**
	 * Add node 'e' to array.
	 * @param {BaseNode} e a node
	 */
	opIF.prototype.push = function(e) {
		this._currentState.push(e);
	};
	
	/**
	 * Get a parent node.
	 * @return {BaseNode}
	 */
	opIF.prototype.getParent = function() {
		return this._parent;
	};
	
	/**
	 * Switch from collection onTrue to onFalse.
	 */
	opIF.prototype.switchToElse = function() {
		this._currentState = this._onFalse;
	};
	
	/**
	 * Process node depend on conditional and get the html string.
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 */
	opIF.prototype.get = function(d, param, element, deep) {
		var $T = d;
		var $P = param;
		var $Q = element;
		var tab = (eval(this._cond)) ? (this._onTrue) : (this._onFalse);
		var ret = '';
		for(var i=0, l=tab.length; i<l; ++i) {
			ret += tab[i].get(d, param, element, deep);
		}
		return ret;
	};
	
	/**
	 * Handler for a tag 'FOR'. Create new and return relative opFOREACH object.
	 * @param {string} oper content of operator {#..}
	 * @param {object} par parent node
	 */
	opFORFactory = function(oper, par) {
		if(oper.match(/\{#for (\w+?) *= *(\S+?) +to +(\S+?) *(?:step=(\S+?))*\}/)) {
			oper = '{#foreach opFORFactory.funcIterator as ' + RegExp.$1 + ' begin=' + (RegExp.$2 || 0) + ' end=' + (RegExp.$3 || -1) + ' step=' + (RegExp.$4 || 1) + ' extData=$T}';
			return new opFOREACH(oper, par);
		} else {
			throw new Error('jTemplates: Operator failed "find": ' + oper);
		}
	};
	
	/**
	 * Function returns inputs data (using internal with opFORFactory)
	 * @param {object} i any data
	 * @return {object} any data (equal parameter 'i')
	 * @private
	 * @static
	 */
	opFORFactory.funcIterator = function(i) {
		return i;
	};
	
	/**
	 * Create a new loop node.
	 * @constructor
	 * @param {string} oper content of operator {#..}
	 * @param {object} par parent node
	 * @inherits BaseArray
	 * @class A class represent: {#foreach}.
	 */
	var opFOREACH = function(oper, par) {
		this._parent = par;
		oper.match(/\{#foreach (.+?) as (\w+?)( .+)*\}/);
		this._arg = RegExp.$1;
		this._name = RegExp.$2;
		this._option = RegExp.$3 || null;
		this._option = TemplateUtils.optionToObject(this._option);
		
		this._onTrue = [];
		this._onFalse = [];
		this._currentState = this._onTrue;
	};
	
	/**
	 * Add node 'e' to array.
	 * @param {BaseNode} e
	 */
	opFOREACH.prototype.push = function(e) {
		this._currentState.push(e);
	};
	
	/**
	 * Get a parent node.
	 * @return {BaseNode}
	 */
	opFOREACH.prototype.getParent = function() {
		return this._parent;
	};
	
	/**
	 * Switch from collection onTrue to onFalse.
	 */
	opFOREACH.prototype.switchToElse = function() {
		this._currentState = this._onFalse;
	};
	
	/**
	 * Process loop and get the html string.
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 */
	opFOREACH.prototype.get = function(d, param, element, deep) {
		var $T = d;
		var $P = param;
		var $Q = element;
		var fcount = eval(this._arg);	//array of elements in foreach
		var key = [];	//only for objects
		var mode = typeof fcount;
		if(mode == 'object') {
			var arr = [];
			jQuery.each(fcount, function(k, v) {
				key.push(k);
				arr.push(v);
			});
			fcount = arr;
		}
		var extData = (this._option.extData !== undefined) ? (eval(this._option.extData)) : {};
		var s = Number(eval(this._option.begin) || 0), e;	//start, end
		var step = Number(eval(this._option.step) || 1);
		if(mode != 'function') {
			e = fcount.length;
		} else {
			if(this._option.end === undefined || this._option.end === null) {
				e = Number.MAX_VALUE;
			} else {
				e = Number(eval(this._option.end)) + ((step>0) ? (1) : (-1));
			}
		}
		var ret = '';	//returned string
		var i,l;	//iterators
		
		if(this._option.count) {
			var tmp = s + Number(eval(this._option.count));
			e = (tmp > e) ? (e) : (tmp);
		}
		if((e>s && step>0) || (e<s && step<0)) {
			var iteration = 0;
			var _total = (mode != 'function') ? (Math.ceil((e-s)/step)) : undefined;
			var ckey, cval;	//current key, current value
			for(; ((step>0) ? (s<e) : (s>e)); s+=step, ++iteration) {
				ckey = key[s];
				if(mode != 'function') {
					cval = fcount[s];
				} else {
					cval = fcount(s);
					if(cval === undefined || cval === null) {
						break;
					}
				}
				if((mode == 'object') && (ckey in Object) && (Object[ckey] === $T[ckey])) {
					continue;
				}
				$T = extData;
				var p = $T[this._name] = cval;
				$T[this._name + '$index'] = s;
				$T[this._name + '$iteration'] = iteration;
				$T[this._name + '$first'] = (iteration==0);
				$T[this._name + '$last'] = (s+step>=e);
				$T[this._name + '$total'] = _total;
				$T[this._name + '$key'] = ckey;
				$T[this._name + '$typeof'] = typeof cval;
				for(i=0, l=this._onTrue.length; i<l; ++i) {
					ret += this._onTrue[i].get($T, param, element, deep);
				}
				delete $T[this._name + '$index'];
				delete $T[this._name + '$iteration'];
				delete $T[this._name + '$first'];
				delete $T[this._name + '$last'];
				delete $T[this._name + '$total'];
				delete $T[this._name + '$key'];
				delete $T[this._name + '$typeof'];
				delete $T[this._name];
			}
		} else {
			for(i=0, l=this._onFalse.length; i<l; ++i) {
				ret += this._onFalse[i].get($T, param, element, deep);
			}
		}
		return ret;
	};
	
	/**
	 * Create a new entry for included template.
	 * @constructor
	 * @param {string} oper content of operator {#..}
	 * @param {array} includes
	 * @inherits BaseNode
	 * @class A class represent: {#include}.
	 */
	var Include = function(oper, includes) {
		oper.match(/\{#include (.*?)(?: root=(.*?))?\}/);
		this._template = includes[RegExp.$1];
		if(this._template == undefined) {
			throw new Error('jTemplates: Cannot find include: ' + RegExp.$1);
		}
		this._root = RegExp.$2;
	};
	
	/**
	 * Run method get on included template.
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 */
	Include.prototype.get = function(d, param, element, deep) {
		var $T = d;
		return this._template.get(eval(this._root), param, element, deep);
	};
	
	/**
	 * Create new node for {#param}.
	 * @constructor
	 * @param {string} oper content of operator {#..}
	 * @inherits BaseNode
	 * @class A class represent: {#param}.
	 */
	var UserParam = function(oper) {
		oper.match(/\{#param name=(\w*?) value=(.*?)\}/);
		this._name = RegExp.$1;
		this._value = RegExp.$2;
	};
	
	/**
	 * Return value of selected parameter.
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 */
	UserParam.prototype.get = function(d, param, element, deep) {
		var $T = d;
		var $P = param;
		var $Q = element;
		
		param[this._name] = eval(this._value);
		return '';
	};
	
	/**
	 * Create a new cycle node.
	 * @constructor
	 * @param {string} oper content of operator {#..}
	 * @inherits BaseNode
	 * @class A class represent: {#cycle}.
	 */
	var Cycle = function(oper) {
		oper.match(/\{#cycle values=(.*?)\}/);
		this._values = eval(RegExp.$1);
		this._length = this._values.length;
		if(this._length <= 0) {
			throw new Error('jTemplates: cycle has no elements');
		}
		this._index = 0;
		this._lastSessionID = -1;
	};

	/**
	 * Do a step on cycle and return value.
	 * @param {object} d data
	 * @param {object} param parameters
	 * @param {Element} element a HTML element
	 * @param {Number} deep
	 * @return {String}
	 */
	Cycle.prototype.get = function(d, param, element, deep) {
		var sid = jQuery.data(element, 'jTemplateSID');
		if(sid != this._lastSessionID) {
			this._lastSessionID = sid;
			this._index = 0;
		}
		var i = this._index++ % this._length;
		return this._values[i];
	};
	
	/**
	 * Add a Template to HTML Elements.
	 * @param {Template/string} s a Template or a template string
	 * @param {array} [includes] Array of included templates.
	 * @param {object} [settings] Settings (see Template)
	 * @return {jQuery} chainable jQuery class
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.setTemplate = function(s, includes, settings) {
		if(s.constructor === Template) {
			return jQuery(this).each(function() {
				jQuery.data(this, 'jTemplate', s);
				jQuery.data(this, 'jTemplateSID', 0);
			});
		} else {
			return jQuery(this).each(function() {
				jQuery.data(this, 'jTemplate', new Template(s, includes, settings));
				jQuery.data(this, 'jTemplateSID', 0);
			});
		}
	};
	
	/**
	 * Add a Template (from URL) to HTML Elements.
	 * @param {string} url_ URL to template
	 * @param {array} [includes] Array of included templates.
	 * @param {object} [settings] Settings (see Template)
	 * @return {jQuery} chainable jQuery class
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.setTemplateURL = function(url_, includes, settings) {
		var s = jQuery.ajax({
			url: url_,
			async: false
		}).responseText;
		
		return jQuery(this).setTemplate(s, includes, settings);
	};
	
	/**
	 * Create a Template from element's content.
	 * @param {string} elementName an ID of element
	 * @param {array} [includes] Array of included templates.
	 * @param {object} [settings] Settings (see Template)
	 * @return {jQuery} chainable jQuery class
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.setTemplateElement = function(elementName, includes, settings) {
		var s = $('#' + elementName).val();
		if(s == null) {
			s = $('#' + elementName).html();
			s = s.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
		}
		
		s = jQuery.trim(s);
		s = s.replace(/^<\!\[CDATA\[([\s\S]*)\]\]>$/im, '$1');
		
		return jQuery(this).setTemplate(s, includes, settings);
	};
	
	/**
	 * Check it HTML Elements have a template. Return count of templates.
	 * @return {number} Number of templates.
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.hasTemplate = function() {
		var count = 0;
		jQuery(this).each(function() {
			if(jQuery.data(this, 'jTemplate')) {
				++count;
			}
		});
		return count;
	};
	
	/**
	 * Remote Template from HTML Element(s)
	 * @return {jQuery} chainable jQuery class
	 */
	jQuery.fn.removeTemplate = function() {
		jQuery(this).processTemplateStop();
		return jQuery(this).each(function() {
			jQuery.removeData(this, 'jTemplate');
		});
	};
	
	/**
	 * Set to parameter 'name' value 'value'.
	 * @param {string} name
	 * @param {object} value
	 * @return {jQuery} chainable jQuery class
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.setParam = function(name, value) {
		return jQuery(this).each(function() {
			var t = jQuery.data(this, 'jTemplate');
			if(t === undefined) {
				throw new Error('jTemplates: Template is not defined.');
			}
			t.setParam(name, value); 
		});
	};
	
	/**
	 * Process template using data 'd' and parameters 'param'. Update HTML code.
	 * @param {object} d data 
	 * @param {object} [param] parameters
	 * @return {jQuery} chainable jQuery class
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.processTemplate = function(d, param) {
		return jQuery(this).each(function() {
			var t = jQuery.data(this, 'jTemplate');
			if(t === undefined) {
				throw new Error('jTemplates: Template is not defined.');
			}
			jQuery.data(this, 'jTemplateSID', jQuery.data(this, 'jTemplateSID') + 1);
			jQuery(this).html(t.get(d, param, this, 0));
		});
	};
	
	/**
	 * Process template using data from URL 'url_' (only format JSON) and parameters 'param'. Update HTML code.
	 * @param {string} url_ URL to data (in JSON)
	 * @param {object} [param] parameters
	 * @return {jQuery} chainable jQuery class
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.processTemplateURL = function(url_, param) {
		var that = this;
		var s = jQuery.ajax({
			url: url_,
			async: false,
			cache: false,
			dataType: 'json',
			success: function(d) {
				jQuery(that).processTemplate(d, param);
			}
		});
		return this;
	};

//#####>UPDATER
	/**
	 * Create new Updater.
	 * @constructor
	 * @param {string} url A destination URL
	 * @param {object} param Parameters (for template)
	 * @param {number} interval Time refresh interval
	 * @param {object} args Additional URL parameters (in URL alter ?) as assoc array.
	 * @param {array} objs An array of HTMLElement which will be modified by Updater.
	 * @class This class is used for 'Live Refresh!'.
	 */
	var Updater = function(url, param, interval, args, objs) {
		this._url = url;
		this._param = param;
		this._interval = interval;
		this._args = args;
		this.objs = objs;
		this.timer = null;
		
		var that = this;
		jQuery(objs).each(function() {
			jQuery.data(this, 'jTemplateUpdater', that);
		});
		this.run();
	};
	
	/**
	 * Create new HTTP request to server, get data (as JSON) and send it to templates. Also check does HTMLElements still exists in Document.
	 */
	Updater.prototype.run = function() {
		this.detectDeletedNodes();
		if(this.objs.length == 0) {
			return;
		}
		var that = this;
		jQuery.getJSON(this._url, this._args, function(d) {
		  jQuery(that.objs).processTemplate(d, that._param);
		});
		this.timer = setTimeout(function(){that.run();}, this._interval);
	};
	
	/**
	 * Check does HTMLElements still exists in HTML Document.
	 * If not exist, delete it from property 'objs'.
	 */
	Updater.prototype.detectDeletedNodes = function() {
		this.objs = jQuery.grep(this.objs, function(o) {
			if(jQuery.browser.msie) {
				var n = o.parentNode;
				while(n && n != document) {
					n = n.parentNode;
				}
				return n != null;
			} else {
				return o.parentNode != null;
			}
		});
	};
	
	/**
	 * Start 'Live Refresh!'.
	 * @param {string} url A destination URL
	 * @param {object} param Parameters (for template)
	 * @param {number} interval Time refresh interval
	 * @param {object} args Additional URL parameters (in URL alter ?) as assoc array.
	 * @return {number} timeoutID
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.processTemplateStart = function(url, param, interval, args) {
		var u = new Updater(url, param, interval, args, this);
		return u.timer;
	};
	
	/**
	 * Stop 'Live Refresh!'.
	 * @return {jQuery} chainable jQuery class
	 * @memberOf jQuery.fn
	 */
	jQuery.fn.processTemplateStop = function() {
		return jQuery(this).each(function() {
			var updater = jQuery.data(this, 'jTemplateUpdater');
			if(updater == null) {
				return;
			}
			var that = this;
			updater.objs = jQuery.grep(updater.objs, function(o) {
				return o != that;
			});
			jQuery.removeData(this, 'jTemplateUpdater');
		});
	};
//#####<UPDATER
	
	jQuery.extend(/** @scope jQuery.prototype */{
		/**
		 * Create new Template.
		 * @param {string} s A template string (like: "Text: {$T.txt}.").
		 * @param {array} includes Array of included templates.
		 * @param {object} settings Settings. (see Template)
		 * @return {Template}
		 * @obsolete
		 */
		createTemplate: function(s, includes, settings) {
			return new Template(s, includes, settings);
		},
		
		/**
		 * Create new Template from URL.
		 * @param {string} url_ URL to template
		 * @param {array} includes Array of included templates.
		 * @param {object} settings Settings. (see Template)
		 * @return {Template}
		 * @obsolete
		 */
		createTemplateURL: function(url_, includes, settings) {
			var s = jQuery.ajax({
				url: url_,
				async: false
			}).responseText;
			
			return new Template(s, includes, settings);
		}
	});
	
})(jQuery);}
;(function($) {
	$.extend({
		tablesorterPager: new function() {
			function updatePageDisplay(c) {
				var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);	
			}

			function setPageSize(table,size) {
				var c = table.config;
				c.size = size;
				c.totalPages = Math.ceil(c.totalRows / c.size);
				c.pagerPositionSet = false;
				moveToPage(table);
				fixPosition(table);
			}

			function fixPosition(table) {
				var c = table.config;
				if(!c.pagerPositionSet && c.positionFixed) {
					var c = table.config, o = $(table);
					if(o.offset) {
						c.container.css({
							top: o.offset().top + o.height() + 'px',
							position: 'absolute'
						});
					}
					c.pagerPositionSet = true;
				}
			}
			
			function moveToFirstPage(table) {
				var c = table.config;
				c.page = 0;
				moveToPage(table);
			}
			
			function moveToLastPage(table) {
				var c = table.config;
				c.page = (c.totalPages-1);
				moveToPage(table);
			}
			
			function moveToNextPage(table) {
				var c = table.config;
				c.page++;
				if(c.page >= (c.totalPages-1)) {
					c.page = (c.totalPages-1);
				}
				moveToPage(table);
			}
			
			function moveToPrevPage(table) {
				var c = table.config;
				c.page--;
				if(c.page <= 0) {
					c.page = 0;
				}
				moveToPage(table);
			}
			
			function moveToPage(table) {
				var c = table.config;
				if(c.page < 0 || c.page > (c.totalPages-1)) {
					c.page = 0;
				}
				
				renderTable(table,c.rowsCopy);
			}
		
			function renderTable(table,rows) {
				
				var c = table.config;
				var l = rows.length;
				var s = (c.page * c.size);
				var e = (s + c.size);
				if(e > rows.length ) {
					e = rows.length;
				}
				
			
				var tableBody = $(table.tBodies[0]);
				
				// clear the table body
				
				$.tablesorter.clearTableBody(table);
				
				for(var i = s; i < e; i++) {
					
					//tableBody.append(rows[i]);
					
					var o = rows[i];
					var l = o.length;
					for(var j=0; j < l; j++) {
						
						tableBody[0].appendChild(o[j]);

					}
				}
				
				fixPosition(table,tableBody);
				
				$(table).trigger("applyWidgets");
				
				if( c.page >= c.totalPages ) {
        			moveToLastPage(table);
				}
				
				updatePageDisplay(c);

			}

			this.appender = function(table,rows) {
				
				var c = table.config;
				
				c.rowsCopy = rows;
				c.totalRows = rows.length;
				c.totalPages = Math.ceil(c.totalRows / c.size);
				
				renderTable(table,rows);
			};
			
			this.defaults = {
				size: 10,
				offset: 0,
				page: 0,
				totalRows: 0,
				totalPages: 0,
				container: null,
				cssNext: '.next',
				cssPrev: '.prev',
				cssFirst: '.first',
				cssLast: '.last',
				cssPageDisplay: '.pagedisplay',
				cssPageSize: '.pagesize',
				seperator: "/",
				positionFixed: true,
				appender: this.appender
			};

			this.construct = function(settings) {
				
				return this.each(function() {	

					config = $.extend(this.config, $.tablesorterPager.defaults, settings);
					
					var table = this, pager = config.container;
			
					$(this).trigger("appendCache");
					
					config.size = parseInt($(".pagesize",pager).val());
			
					$(config.cssFirst,pager).click(function() {
						moveToFirstPage(table);
						return false;
					});
					$(config.cssNext,pager).click(function() {
						moveToNextPage(table);
						return false;
					});
					$(config.cssPrev,pager).click(function() {
						moveToPrevPage(table);
						return false;
					});
					$(config.cssLast,pager).click(function() {
						moveToLastPage(table);
						return false;
					});
					$(config.cssPageSize,pager).change(function() {
						setPageSize(table,parseInt($(this).val()));
						return false;
					});
				});
			};
		}
	});
	// extend plugin scope
	$.fn.extend({
        tablesorterPager: $.tablesorterPager.construct
	});
	
})(jQuery);				;
(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'.',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,cells[i]);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,node){var l=parsers.length;for(var i=1;i<l;i++){if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)){return parsers[i];}}return parsers[0];}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=table.tBodies[0].rows[i],cols=[];cache.row.push($(c));for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));}cols.push(i);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){if(!node)return"";var t="";if(config.textExtraction=="simple"){if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){t=node.childNodes[0].innerHTML;}else{t=node.innerHTML;}}else{if(typeof(config.textExtraction)=="function"){t=config.textExtraction(node);}else{t=$(node).text();}}return t;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){rows.push(r[n[i][checkCell]]);if(!table.config.appender){var o=r[n[i][checkCell]];var l=o.length;for(var j=0;j<l;j++){tableBody[0].appendChild(o[j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false,tableHeadersRows=[];for(var i=0;i<table.tHead.rows.length;i++){tableHeadersRows[i]=0;};$tableHeaders=$("thead th",table);$tableHeaders.each(function(index){this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(!this.sortDisabled){$(this).addClass(table.config.cssHeader);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){i=(v.toLowerCase()=="desc")?1:0;}else{i=(v==(0||1))?v:0;}return i;}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(getCachedSortType(table.config.parsers,c)=="text")?((order==0)?"sortText":"sortTextDesc"):((order==0)?"sortNumeric":"sortNumericDesc");var e="e"+i;dynamicExp+="var "+e+" = "+s+"(a["+c+"],b["+c+"]); ";dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function sortText(a,b){return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){var DECIMAL='\\'+config.decimal;var exp='/(^[+]?0('+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*'+DECIMAL+'0+$)/';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}$("tr:visible",table.tBodies[0]).filter(':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);;﻿/**
 * Fix za date parser, table sorter plugin-a.
 * 
 * Problem:
 * 	datumski parser ne podrzava tocku
 * 	primjer:
 * 		zna parsirati: "17-12-2008", "17/12/2008"
 * 		ne zna: "17.12.2008"
 * 
 * Rijesenje
 * 	kod je iskopiran iz TableSorter Version 2.0.3 => linija 792.
 * 	jedina promjena u kodu je datumski delimiter
 * 		[\/\-] => [\/\-\.]
 * 
 * Kod se izvrsava samo kod datuma s tockom, dok kod ostalih ostaje kako je
 */

$.tablesorter.addParser({
		id: "customDate",
		is: function(s) {
			return /\d{1,2}[\/\-\.]\d{1,2}[\/\-\.]\d{2,4}/.test(s);
		},
		format: function(s,table) {
			var c = table.config;
			s = s.replace(/\-/g,"/");
			if(c.dateFormat == "us") {
				// reformat the string in ISO format
				s = s.replace(/(\d{1,2})[\/\-\.](\d{1,2})[\/\-\.](\d{4})/, "$3/$1/$2");
				
			} else if(c.dateFormat == "uk") {
				//reformat the string in ISO format
				s = s.replace(/(\d{1,2})[\/\-\.](\d{1,2})[\/\-\.](\d{4})/, "$3/$2/$1");
			} else if(c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") {
				s = s.replace(/(\d{1,2})[\/\-\.](\d{1,2})[\/\-\.](\d{2})/, "$1/$2/$3");	
			}
			return $.tablesorter.formatFloat(new Date(s).getTime());
		},
		type: "numeric"
	});;/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;;eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(k($){k 3w(){8.5T=G;8.5N=0;8.4e=[];8.3G=n;8.22=[];8.2O=G;8.2f=G;8.4A=[];8.4A[""]={6I:"81",6A:"7V 3D 6B g",6M:"6x",6N:"6x 7Z 70",5k:"&#7c;7e",6J:"3B 3D 9n B",55:"9c&#9b;",6P:"3B 3D 3P B",6R:"8m",6T:"3B 3D 6B B",1e:["8e","8h","8G","8u","6n","8x","8B","8y","8H","8q","8n","97"],1N:["98","8V","8Y","7i","6n","7q","7u","7r","7h","7y","7g","76"],5x:"3B a 5v B",5B:"3B a 5v r",6y:"7T",8M:"7o 7m 3D r",1f:["7p","7w","7x","7v","7s","75","79"],1k:["7d","7t","7W","80","87","88","86"],4n:["85","82","7R","7E","7D","7B","7P"],6v:"7Q 3T 7K 7Y 7M E",2M:"5z 3T, M d",2C:"7L/7N/7O",1o:0,5K:"5z a g",1F:G};8.1j={2E:"2x",2j:"6k",2w:n,30:"",2n:"...",3b:"",66:G,3J:18,5q:G,3n:G,5F:18,5G:18,5A:"-10:+10",3x:18,2Q:G,3A:G,4h:8.3i,1x:"+10",1b:G,6W:8.2M,H:n,L:n,1r:"7J",3m:n,3f:n,2k:n,3h:n,6q:1,2z:1,1Q:G,4y:" - "};$.3L(8.1j,8.4A[""]);8.z=$(\'<F O="5U"></F>\')}$.3L(3w.5p,{2I:"7C",4X:k(){f(8.5T){7A.4X.2h("",5o)}},6U:k(b){c O=8.5N++;8.4e[O]=b;o O},1h:k(O){o 8.4e[O]||O},7H:k(v){3a(8.1j,v||{});o 8},5O:k(p,v){c 2e=n;1g(4c 62 8.1j){c 4f=p.7G("g:"+4c);f(4f){2e=2e||{};6L{2e[4c]=7F(4f)}6O(7S){2e[4c]=4f}}}c 1J=p.1J.4C();c 4E=(2e?$.3L(v||{},2e||{}):v);f(1J=="q"){c b=(b&&!2e?b:u 3y(4E,G));8.68(p,b)}K{f(1J=="F"||1J=="2N"){c b=u 3y(4E,18);8.5W(p,b)}}},7U:k(p){c 1J=p.1J.4C();c 4T=p.1D;p.1D=n;c $p=$(p);f(1J=="q"){$p.3d(".4w").4G("").3X().3d(".2g").4G("").3X().2P(8.2I).45("2x",8.31).45("4V",8.4t).45("5X",8.4R);c 3W=$p.4H(".6h");f(3W){3W.4G(3W.J())}}K{f(1J=="F"||1J=="2N"){$p.2P(8.2I).6j()}}f($("q[1D="+4T+"]").17==0){8.4e[4T]=n}},7z:k(p){p.4g=G;$(p).3d("3s.2g").4j(k(){8.4g=G}).3X().3d("3O.2g").1B({5D:"1.0",6r:""});8.22=$.6g(8.22,k(t){o(t==p?n:t)})},89:k(p){p.4g=18;$(p).3d("3s.2g").4j(k(){8.4g=18}).3X().3d("3O.2g").1B({5D:"0.5",6r:"46"});8.22=$.6g($.h.22,k(t){o(t==p?n:t)});8.22[$.h.22.17]=p},6o:k(p){f(!p){o G}1g(c i=0;i<8.22.17;i++){f(8.22[i]==p){o 18}}o G},73:k(p,19,t){c v=19||{};f(1V 19=="3E"){v={};v[19]=t}f(b=8.1h(p.1D)){3a(b.1H,v);8.1S(b)}},72:k(p,g,23){f(b=8.1h(p.1D)){b.4x(g,23);8.1S(b)}},74:k(p){c b=8.1h(p.1D);o(b?b.4F():n)},4t:k(e){c b=$.h.1h(8.1D);f($.h.2O){3k(e.4W){x 9:$.h.2q(n,"");I;x 13:$.h.5b(b,b.1E,b.1L,$("1i.4a",b.z)[0]);o G;I;x 27:$.h.2q(n,b.l("1r"));I;x 33:$.h.1d(b,(e.1G?-1:-b.l("2z")),(e.1G?"Y":"M"));I;x 34:$.h.1d(b,(e.1G?+1:+b.l("2z")),(e.1G?"Y":"M"));I;x 35:f(e.1G){$.h.5n(b)}I;x 36:f(e.1G){$.h.56(b)}I;x 37:f(e.1G){$.h.1d(b,-1,"D")}I;x 38:f(e.1G){$.h.1d(b,-7,"D")}I;x 39:f(e.1G){$.h.1d(b,+1,"D")}I;x 40:f(e.1G){$.h.1d(b,+7,"D")}I}}K{f(e.4W==36&&e.1G){$.h.31(8)}}},4R:k(e){c b=$.h.1h(8.1D);c 1Z=$.h.6S(b.l("2C"));c 4z=7l.7n(e.6l==6Q?e.4W:e.6l);o e.1G||(4z<" "||!1Z||1Z.6t(4z)>-1)},68:k(p,b){c q=$(p);f(q.4M("."+8.2I)){o}c 30=b.l("30");c 1F=b.l("1F");f(30){f(1F){q.64(\'<2N Q="4w">\'+30)}K{q.63(\'<2N Q="4w">\'+30)}}c 2E=b.l("2E");f(2E=="2x"||2E=="44"){q.2x(8.31)}f(2E=="3s"||2E=="44"){q.8X(\'<2N Q="6h">\');c 2n=b.l("2n");c 3b=b.l("3b");c 3l=$(b.l("66")?$("<3O>").24("2g").48({5j:3b,6a:2n,4Z:2n}):$("<3s>").24("2g").48({3F:"3s"}).J(3b!=""?$("<3O>").48({5j:3b,6a:2n,4Z:2n}):2n));f(1F){q.64(3l)}K{q.63(3l)}3l.92(k(){f($.h.2O&&$.h.2R==p){$.h.2q()}K{$.h.31(p)}})}q.24(8.2I).4V(8.4t).5X(8.4R).4p("5Z.h",k(2T,2p,t){b.1H[2p]=t}).4p("61.h",k(2T,2p){o b.l(2p)});q[0].1D=b.14},5W:k(p,b){c q=$(p);f(q.4M("."+8.2I)){o}q.24(8.2I).3o(b.z).4p("5Z.h",k(2T,2p,t){b.1H[2p]=t}).4p("61.h",k(2T,2p){o b.l(2p)});q[0].1D=b.14;8.1S(b)},8R:k(b){c X=b.2W();b.z.2b(X[1]*$(".h",b.z[0]).2b())},8U:k(q,6c,2k,v,2a){c b=8.6b;f(!b){b=8.6b=u 3y({},G);8.2d=$(\'<q 3F="50" 1P="1" 5f="1K: 4J; 2F: -5J;"/>\');8.2d.4V(8.4t);$("1M").3o(8.2d);8.2d[0].1D=b.14}3a(b.1H,v||{});8.2d.42(6c);8.1v=(2a?(2a.17?2a:[2a.95,2a.9i]):n);f(!8.1v){c 4m=4k.5V||R.1t.3S||R.1M.3S;c 4b=4k.5C||R.1t.4o||R.1M.4o;c 3K=R.1t.2J||R.1M.2J;c 3C=R.1t.2y||R.1M.2y;8.1v=[(4m/2)-2A+3K,(4b/2)-9h+3C]}8.2d.1B("2V",8.1v[0]+"2Z").1B("2F",8.1v[1]+"2Z");b.1H.2k=2k;8.2f=18;8.z.24("5I");8.31(8.2d[0]);f($.3v){$.3v(8.z)}o 8},31:k(q){q=q.p||q;f(q.1J.4C()!="q"){q=$("q",q.9k)[0]}f($.h.6o(q)||$.h.2R==q){o}c b=$.h.1h(q.1D);c 3f=b.l("3f");3a(b.1H,(3f?3f.2h(q,[q,b]):{}));$.h.2q(n,"");$.h.2R=q;b.6K(q);f($.h.2f){q.t=""}f(!$.h.1v){$.h.1v=$.h.4I(q);$.h.1v[1]+=q.9f}c 1I=G;$(q).4H().4j(k(){1I|=$(8).1B("1K")=="4N"});f(1I&&$.1T.4D){$.h.1v[0]-=R.1t.2J;$.h.1v[1]-=R.1t.2y}b.z.1B("1K",($.h.2f&&$.3v?"9e":(1I?"4N":"4J"))).1B({2V:$.h.1v[0]+"2Z",2F:$.h.1v[1]+"2Z"});$.h.1v=n;b.1m=n;$.h.1S(b);f(!b.2D){c 1r=b.l("1r");c 4U=k(){$.h.2O=18;$.h.6f(b)};c 2j=b.l("2j")||"6k";b.z[2j](1r,4U);f(1r==""){4U()}f(b.C[0].3F!="4K"){b.C[0].2x()}$.h.3G=b}},1S:k(b){b.z.6j().3o(b.6E());c X=b.2W();f(X[0]!=1||X[1]!=1){b.z.24("6e")}K{b.z.2P("6e")}f(b.l("1F")){b.z.24("6d")}K{b.z.2P("6d")}f(b.C&&b.C[0].3F!="4K"){$(b.C[0]).2x()}},6f:k(b){c X=b.2W();b.z.2b(X[1]*$(".h",b.z[0])[0].96);f($.1T.3H&&2G($.1T.5S)<7){$("5i.5P").1B({2b:b.z.2b()+4,4s:b.z.4s()+4})}c 1I=b.z.1B("1K")=="4N";c 2a=b.C?$.h.4I(b.C[0]):n;c 4m=4k.5V||R.1t.3S||R.1M.3S;c 4b=4k.5C||R.1t.4o||R.1M.4o;c 3K=(1I?0:R.1t.2J||R.1M.2J);c 3C=(1I?0:R.1t.2y||R.1M.2y);f((b.z.1a().2V+b.z.2b()-(1I&&$.1T.3H?R.1t.2J:0))>(4m+3K)){b.z.1B("2V",1O.2u(3K,2a[0]+(b.C?$(b.C[0]).2b():n)-b.z.2b()-(1I&&$.1T.4D?R.1t.2J:0))+"2Z")}f((b.z.1a().2F+b.z.4s()-(1I&&$.1T.3H?R.1t.2y:0))>(4b+3C)){b.z.1B("2F",1O.2u(3C,2a[1]-(8.2f?0:b.z.4s())-(1I&&$.1T.4D?R.1t.2y:0))+"2Z")}},4I:k(2B){4q(2B&&(2B.3F=="4K"||2B.8c!=1)){2B=2B.8b}c 1K=$(2B).1a();o[1K.2V,1K.2F]},2q:k(q,1r){c b=8.3G;f(!b){o}c 1Q=b.l("1Q");f(1Q&&8.2v){8.47(b,b.3z(b.1q,b.1A,b.1p))}8.2v=G;f(8.2O){1r=(1r!=n?1r:b.l("1r"));c 2j=b.l("2j");b.z[(2j=="8f"?"8i":(2j=="8g"?"8s":"8t"))](1r,k(){$.h.4L(b)});f(1r==""){8.4L(b)}c 3h=b.l("3h");f(3h){3h.2h((b.C?b.C[0]:n),[b.4F(),b])}8.2O=G;8.2R=n;b.1H.3q=n;f(8.2f){8.2d.1B({1K:"4J",2V:"0",2F:"-5J"});f($.3v){$.8J();$("1M").3o(8.z)}}8.2f=G}8.3G=n},4L:k(b){b.z.2P("5I").45(".h");$(".6V",b.z).8w()},6p:k(2T){f(!$.h.3G){o}c $p=$(2T.p);f(($p.4H("#5U").17==0)&&($p.48("Q")!="2g")&&$.h.2O&&!($.h.2f&&$.3v)){$.h.2q(n,"")}},1d:k(O,1a,2t){c b=8.1h(O);b.1d(1a,2t);8.1S(b)},56:k(O){c g=u A();c b=8.1h(O);b.1z=g.S();b.2o=b.1E=g.15();b.2m=b.1L=g.P();8.1d(b)},58:k(O,2L,2t){c b=8.1h(O);b.3Z=G;b[2t=="M"?"2o":"2m"]=2L.25[2L.91].t-0;8.1d(b)},51:k(O){c b=8.1h(O);f(b.C&&b.3Z&&!$.1T.3H){b.C[0].2x()}b.3Z=!b.3Z},6z:k(O,E){c b=8.1h(O);b.1H.1o=E;8.1S(b)},5b:k(O,B,r,1i){f($(1i).4M(".6Z")){o}c b=8.1h(O);c 1Q=b.l("1Q");f(1Q){f(!8.2v){$(".h 1i").2P("5c");$(1i).24("5c")}8.2v=!8.2v}b.1z=b.1q=$("a",1i).J();b.1E=b.1A=B;b.1L=b.1p=r;8.47(O,b.3z(b.1q,b.1A,b.1p));f(8.2v){b.1R=b.29=b.1U=n;b.1m=u A(b.1p,b.1A,b.1q);8.1S(b)}K{f(1Q){b.1R=b.1q;b.29=b.1A;b.1U=b.1p;b.1z=b.1q=b.1m.S();b.1E=b.1A=b.1m.15();b.1L=b.1p=b.1m.P();b.1m=n;f(b.2D){8.1S(b)}}}},5n:k(O){c b=8.1h(O);f(b.l("5q")){o}8.2v=G;b.1R=b.29=b.1U=b.1m=n;8.47(b,"")},47:k(O,2r){c b=8.1h(O);2r=(2r!=n?2r:b.3z());f(b.1m){2r=b.3z(b.1m)+b.l("4y")+2r}f(b.C){b.C.42(2r)}c 2k=b.l("2k");f(2k){2k.2h((b.C?b.C[0]:n),[2r,b])}K{f(b.C){b.C.3l("70")}}f(b.2D){8.1S(b)}K{f(!8.2v){8.2q(n,b.l("1r"));8.2R=b.C[0];f(1V(b.C[0])!="5t"){b.C[0].2x()}8.2R=n}}},8I:k(g){c E=g.2Y();o[(E>0&&E<6),""]},3i:k(g){c 1n=u A(g.P(),g.15(),g.S(),(g.8E()/-60));c 2S=u A(1n.P(),1-1,4);c 1o=2S.2Y()||7;2S.2X(2S.S()+1-1o);f(1o<4&&1n<2S){1n.2X(1n.S()-3);o $.h.3i(1n)}K{f(1n>u A(1n.P(),12-1,28)){1o=u A(1n.P()+1,1-1,4).2Y()||7;f(1o>4&&(1n.2Y()||7)<1o-3){1n.2X(1n.S()+3);o $.h.3i(1n)}}}o 1O.8j(((1n-2S)/8r)/7)+1},2M:k(g,b){o $.h.5m(b.l("2M"),g,b.41())},4v:k(T,t,v){f(T==n||t==n){3u"6w 5o"}t=(1V t=="5t"?t.8p():t+"");f(t==""){o n}c 1x=(v?v.1x:n)||8.1j.1x;c 1k=(v?v.1k:n)||8.1j.1k;c 1f=(v?v.1f:n)||8.1j.1f;c 1N=(v?v.1N:n)||8.1j.1N;c 1e=(v?v.1e:n)||8.1j.1e;c r=-1;c B=-1;c E=-1;c 1u=G;c 1w=k(1l){c 1y=(N+1<T.17&&T.Z(N+1)==1l);f(1y){N++}o 1y};c 49=k(1l){1w(1l);c 1P=(1l=="y"?4:2);c 4d=0;4q(1P>0&&1C<t.17&&t.Z(1C)>="0"&&t.Z(1C)<="9"){4d=4d*10+(t.Z(1C++)-0);1P--}f(1P==(1l=="y"?4:2)){3u"8o 52 4S 1K "+1C}o 4d};c 4O=k(1l,3Q,3R){c 3g=(1w(1l)?3R:3Q);c 1P=0;1g(c j=0;j<3g.17;j++){1P=1O.2u(1P,3g[j].17)}c 19="";c 6F=1C;4q(1P>0&&1C<t.17){19+=t.Z(1C++);1g(c i=0;i<3g.17;i++){f(19==3g[i]){o i+1}}1P--}3u"9d 19 4S 1K "+6F};c 3U=k(){f(t.Z(1C)!=T.Z(N)){3u"9a 1u 4S 1K "+1C}1C++};c 1C=0;1g(c N=0;N<T.17;N++){f(1u){f(T.Z(N)=="\'"&&!1w("\'")){1u=G}K{3U()}}K{3k(T.Z(N)){x"d":E=49("d");I;x"D":4O("D",1k,1f);I;x"m":B=49("m");I;x"M":B=4O("M",1N,1e);I;x"y":r=49("y");I;x"\'":f(1w("\'")){3U()}K{1u=18}I;46:3U()}}}f(r<2A){r+=u A().P()-u A().P()%2A+(r<=1x?0:-2A)}c g=u A(r,B-1,E);f(g.P()!=r||g.15()+1!=B||g.S()!=E){3u"6w g"}o g},5m:k(T,g,v){f(!g){o""}c 1k=(v?v.1k:n)||8.1j.1k;c 1f=(v?v.1f:n)||8.1j.1f;c 1N=(v?v.1N:n)||8.1j.1N;c 1e=(v?v.1e:n)||8.1j.1e;c 1w=k(1l){c 1y=(N+1<T.17&&T.Z(N+1)==1l);f(1y){N++}o 1y};c 4P=k(1l,t){o(1w(1l)&&t<10?"0":"")+t};c 4Q=k(1l,t,3Q,3R){o(1w(1l)?3R[t]:3Q[t])};c 1W="";c 1u=G;f(g){1g(c N=0;N<T.17;N++){f(1u){f(T.Z(N)=="\'"&&!1w("\'")){1u=G}K{1W+=T.Z(N)}}K{3k(T.Z(N)){x"d":1W+=4P("d",g.S());I;x"D":1W+=4Q("D",g.2Y(),1k,1f);I;x"m":1W+=4P("m",g.15()+1);I;x"M":1W+=4Q("M",g.15(),1N,1e);I;x"y":1W+=(1w("y")?g.P():(g.6H()%2A<10?"0":"")+g.6H()%2A);I;x"\'":f(1w("\'")){1W+="\'"}K{1u=18}I;46:1W+=T.Z(N)}}}}o 1W},6S:k(T){c 1Z="";c 1u=G;1g(c N=0;N<T.17;N++){f(1u){f(T.Z(N)=="\'"&&!1w("\'")){1u=G}K{1Z+=T.Z(N)}}K{3k(T.Z(N)){x"d"||"m"||"y":1Z+="8N";I;x"D"||"M":o n;x"\'":f(1w("\'")){1Z+="\'"}K{1u=18}I;46:1Z+=T.Z(N)}}}o 1Z}});k 3y(v,43){8.14=$.h.6U(8);8.1z=0;8.1E=0;8.1L=0;8.2o=0;8.2m=0;8.C=n;8.2D=43;8.z=(!43?$.h.z:$(\'<F O="93\'+8.14+\'" Q="8a">\'));8.1H=3a(v||{});f(43){8.4x(8.4B())}}$.3L(3y.5p,{l:k(19){o 8.1H[19]!==6Q?8.1H[19]:$.h.1j[19]},6K:k(q){8.C=$(q);c 2C=8.l("2C");c 2s=8.C?8.C.42().5E(8.l("4y")):n;8.1R=8.29=8.1U=n;c g=2w=8.4B();f(2s.17>0){c v=8.41();f(2s.17>1){g=$.h.4v(2C,2s[1],v)||2w;8.1R=g.S();8.29=g.15();8.1U=g.P()}6L{g=$.h.4v(2C,2s[0],v)||2w}6O(e){$.h.4X(e);g=2w}}8.1z=g.S();8.2o=8.1E=g.15();8.2m=8.1L=g.P();8.1q=(2s[0]?g.S():0);8.1A=(2s[0]?g.15():0);8.1p=(2s[0]?g.P():0);8.1d()},4B:k(){c g=8.5l("2w",u A());c H=8.1X("1Y",18);c L=8.1X("2u");g=(H&&g<H?H:g);g=(L&&g>L?L:g);o g},5l:k(19,2w){c 6C=k(1a){c g=u A();g.2X(g.S()+1a);o g};c 6D=k(1a,4u){c g=u A();c 1y=/^([+-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?$/.7f(1a);f(1y){c r=g.P();c B=g.15();c E=g.S();3k(1y[2]||"d"){x"d":x"D":E+=(1y[1]-0);I;x"w":x"W":E+=(1y[1]*7);I;x"m":x"M":B+=(1y[1]-0);E=1O.1Y(E,4u(r,B));I;x"y":x"Y":r+=(1y[1]-0);E=1O.1Y(E,4u(r,B));I}g=u A(r,B,E)}o g};c g=8.l(19);o(g==n?2w:(1V g=="3E"?6D(g,8.3t):(1V g=="52"?6C(g):g)))},4x:k(g,23){8.1z=8.1q=g.S();8.2o=8.1E=8.1A=g.15();8.2m=8.1L=8.1p=g.P();f(8.l("1Q")){f(23){8.1R=23.S();8.29=23.15();8.1U=23.P()}K{8.1R=8.1q;8.29=8.1A;8.1U=8.1p}}8.1d()},4F:k(){c 4Y=(!8.1p||(8.C&&8.C.42()=="")?n:u A(8.1p,8.1A,8.1q));f(8.l("1Q")){o[4Y,(!8.1U?n:u A(8.1U,8.29,8.1R))]}K{o 4Y}},6E:k(){c 2K=u A();2K=u A(2K.P(),2K.15(),2K.S());c 1b=8.l("1b");c 1F=8.l("1F");c 3I=(8.l("5q")?"":\'<F Q="84"><a 26="16.h.5n(\'+8.14+\');"\'+(1b?8.21(8.l("6A")||"&#1s;"):"")+">"+8.l("6I")+"</a></F>");c 5a=\'<F Q="78">\'+(1F?"":3I)+\'<F Q="7k"><a 26="16.h.2q();"\'+(1b?8.21(8.l("6N")||"&#1s;"):"")+">"+8.l("6M")+"</a></F>"+(1F?3I:"")+"</F>";c 3q=8.l("3q");c 3J=8.l("3J");c 3n=8.l("3n");c X=8.2W();c 2z=8.l("2z");c 6G=(X[0]!=1||X[1]!=1);c H=8.1X("1Y",18);c L=8.1X("2u");c V=8.2o;c U=8.2m;f(L){c 3p=u A(L.P(),L.15()-X[1]+1,L.S());3p=(H&&3p<H?H:3p);4q(u A(U,V,1)>3p){V--;f(V<0){V=11;U--}}}c 57=\'<F Q="8Z">\'+(8.54(-1,U,V)?\'<a 26="16.h.1d(\'+8.14+", -"+2z+", \'M\');\\""+(1b?8.21(8.l("6J")||"&#1s;"):"")+">"+8.l("5k")+"</a>":(3n?"":"<3Y>"+8.l("5k")+"</3Y>"))+"</F>";c 3P=\'<F Q="90">\'+(8.54(+1,U,V)?\'<a 26="16.h.1d(\'+8.14+", +"+2z+", \'M\');\\""+(1b?8.21(8.l("6P")||"&#1s;"):"")+">"+8.l("55")+"</a>":(3n?">":"<3Y>"+8.l("55")+"</3Y>"))+"</F>";c J=(3q?\'<F Q="6V">\'+3q+"</F>":"")+(3J&&!8.2D?5a:"")+\'<F Q="8W">\'+(1F?3P:57)+(8.5s(2K)?\'<F Q="8P"><a 26="16.h.56(\'+8.14+\');"\'+(1b?8.21(8.l("6T")||"&#1s;"):"")+">"+8.l("6R")+"</a></F>":"")+(1F?57:3P)+"</F>";c 3A=8.l("3A");1g(c 3N=0;3N<X[0];3N++){1g(c 3r=0;3r<X[1];3r++){c 3e=u A(U,V,8.1z);J+=\'<F Q="94\'+(3r==0?" 9g":"")+\'">\'+8.5H(V,U,H,L,3e,3N>0||3r>0)+\'<5L Q="h" 9j="0" 9m="0"><6X><4l Q="9l">\'+(3A?"<1i>"+8.l("6y")+"</1i>":"");c 1o=8.l("1o");c 3x=8.l("3x");c 1f=8.l("1f");c 1k=8.l("1k");c 4n=8.l("4n");1g(c 20=0;20<7;20++){c E=(20+1o)%7;c 2U=8.l("6v")||"&#1s;";2U=(2U.6t("3T")>-1?2U.6u(/3T/,1f[E]):2U.6u(/D/,1k[E]));J+="<1i"+((20+1o+6)%7>=5?\' Q="71"\':"")+">"+(!3x?"<2N":\'<a 26="16.h.6z(\'+8.14+", "+E+\');"\')+(1b?8.21(2U):"")+\' 4Z="\'+1f[E]+\'">\'+4n[E]+(3x?"</a>":"</2N>")+"</1i>"}J+="</4l></6X><5M>";c 5h=8.3t(U,V);f(U==8.1L&&V==8.1E){8.1z=1O.1Y(8.1z,5h)}c 5g=(8.69(U,V)-1o+7)%7;c 53=(!8.1q?u A(99,9,9):u A(8.1p,8.1A,8.1q));c 23=8.1R?u A(8.1U,8.29,8.1R):53;c 1c=u A(U,V,1-5g);c 6Y=(6G?6:1O.8l((5g+5h)/7));c 3m=8.l("3m");c 2Q=8.l("2Q");c 4h=8.l("4h")||$.h.3i;c 2M=8.l("6W")||$.h.2M;1g(c 5e=0;5e<6Y;5e++){J+=\'<4l Q="8K">\'+(3A?\'<1i Q="8D">\'+4h(1c)+"</1i>":"");1g(c 20=0;20<7;20++){c 5d=(3m?3m.2h((8.C?8.C[0]:n),[1c]):[18,""]);c 2H=(1c.15()!=V);c 4r=2H||!5d[0]||(H&&1c<H)||(L&&1c>L);J+=\'<1i Q="8C\'+((20+1o+6)%7>=5?" 71":"")+(2H?" 8A":"")+(1c.2i()==3e.2i()&&V==8.1E?" 4a":"")+(4r?" 6Z":"")+(2H&&!2Q?"":" "+5d[1]+(1c.2i()>=53.2i()&&1c.2i()<=23.2i()?" 5c":"")+(1c.2i()==2K.2i()?" 8z":""))+\'"\'+(4r?"":" 5R=\\"16(8).24(\'4a\');"+(!1b||(2H&&!2Q)?"":"16(\'#3j"+8.14+"\').J(\'"+(2M.2h((8.C?8.C[0]:n),[1c,8])||"&#1s;")+"\');")+"\\" 6i=\\"16(8).2P(\'4a\');"+(!1b||(2H&&!2Q)?"":"16(\'#3j"+8.14+"\').J(\'&#1s;\');")+\'" 26="16.h.5b(\'+8.14+","+V+","+U+\', 8);"\')+">"+(2H?(2Q?1c.S():"&#1s;"):(4r?1c.S():"<a>"+1c.S()+"</a>"))+"</1i>";1c.2X(1c.S()+1)}J+="</4l>"}V++;f(V>11){V=0;U++}J+="</5M></5L></F>"}}J+=(1b?\'<F 5f="3I: 44;"></F><F O="3j\'+8.14+\'" Q="8v">\'+(8.l("5K")||"&#1s;")+"</F>":"")+(!3J&&!8.2D?5a:"")+\'<F 5f="3I: 44;"></F>\'+($.1T.3H&&2G($.1T.5S)<7&&!8.2D?\'<5i 5j="8F:G;" Q="5P"></5i>\':"");o J},5H:k(V,U,H,L,3e,59){H=(8.1m&&H&&3e<H?3e:H);c 1b=8.l("1b");c J=\'<F Q="8d">\';c 1e=8.l("1e");f(59||!8.l("5F")){J+=1e[V]+"&#1s;"}K{c 5w=(H&&H.P()==U);c 5u=(L&&L.P()==U);J+=\'<2L Q="8k" 6s="16.h.58(\'+8.14+", 8, \'M\');\\" 26=\\"16.h.51("+8.14+\');"\'+(1b?8.21(8.l("5x")||"&#1s;"):"")+">";1g(c B=0;B<12;B++){f((!5w||B>=H.15())&&(!5u||B<=L.15())){J+=\'<3V t="\'+B+\'"\'+(B==V?\' 3M="3M"\':"")+">"+1e[B]+"</3V>"}}J+="</2L>"}f(59||!8.l("5G")){J+=U}K{c 2c=8.l("5A").5E(":");c r=0;c 2l=0;f(2c.17!=2){r=U-10;2l=U+10}K{f(2c[0].Z(0)=="+"||2c[0].Z(0)=="-"){r=U+2G(2c[0],10);2l=U+2G(2c[1],10)}K{r=2G(2c[0],10);2l=2G(2c[1],10)}}r=(H?1O.2u(r,H.P()):r);2l=(L?1O.1Y(2l,L.P()):2l);J+=\'<2L Q="8L" 6s="16.h.58(\'+8.14+", 8, \'Y\');\\" 26=\\"16.h.51("+8.14+\');"\'+(1b?8.21(8.l("5B")||"&#1s;"):"")+">";1g(;r<=2l;r++){J+=\'<3V t="\'+r+\'"\'+(r==U?\' 3M="3M"\':"")+">"+r+"</3V>"}J+="</2L>"}J+="</F>";o J},21:k(50){o" 5R=\\"16(\'#3j"+8.14+"\').J(\'"+50+"\');\\" 6i=\\"16(\'#3j"+8.14+"\').J(\'&#1s;\');\\""},1d:k(1a,2t){c r=8.2m+(2t=="Y"?1a:0);c B=8.2o+(2t=="M"?1a:0);c E=1O.1Y(8.1z,8.3t(r,B))+(2t=="D"?1a:0);c g=u A(r,B,E);c H=8.1X("1Y",18);c L=8.1X("2u");g=(H&&g<H?H:g);g=(L&&g>L?L:g);8.1z=g.S();8.2o=8.1E=g.15();8.2m=8.1L=g.P()},2W:k(){c X=8.l("6q");o(X==n?[1,1]:(1V X=="52"?[1,X]:X))},1X:k(6m,5Y){c g=8.5l(6m+"A",n);f(g){g.8S(0);g.8T(0);g.8Q(0);g.8O(0)}o g||(5Y?8.1m:n)},3t:k(r,B){o 32-u A(r,B,32).S()},69:k(r,B){o u A(r,B,1).2Y()},54:k(1a,67,65){c X=8.2W();c g=u A(67,65+(1a<0?1a:X[1]),1);f(1a<0){g.2X(8.3t(g.P(),g.15()))}o 8.5s(g)},5s:k(g){c 3c=(!8.1m?n:u A(8.1L,8.1E,8.1z));3c=(3c&&8.1m<3c?8.1m:3c);c H=3c||8.1X("1Y");c L=8.1X("2u");o((!H||g>=H)&&(!L||g<=L))},41:k(){c 1x=8.l("1x");1x=(1V 1x!="3E"?1x:u A().P()%2A+2G(1x,10));o{1x:1x,1k:8.l("1k"),1f:8.l("1f"),1N:8.l("1N"),1e:8.l("1e")}},3z:k(E,B,r){f(!E){8.1q=8.1z;8.1A=8.1E;8.1p=8.1L}c g=(E?(1V E=="5t"?E:u A(r,B,E)):u A(8.1p,8.1A,8.1q));o $.h.5m(8.l("2C"),g,8.41())}});k 3a(p,4i){$.3L(p,4i);1g(c 19 62 4i){f(4i[19]==n){p[19]=n}}o p}$.83.h=k(25){c 5r=77.5p.7a.7b(5o,1);f(1V 25=="3E"&&(25=="7X"||25=="S")){o $.h["5y"+25+"3w"].2h($.h,[8[0]].5Q(5r))}o 8.4j(k(){1V 25=="3E"?$.h["5y"+25+"3w"].2h($.h,[8].5Q(5r)):$.h.5O(8,25)})};$.h=u 3w();$(R).7I(k(){$(R.1M).3o($.h.z).7j($.h.6p)})})(16);',62,582,'||||||||this|||inst|var|||if|date|datepicker|||function|_get||null|return|target|input|year||value|new|settings||case||_datepickerDiv|Date|month|_input||day|div|false|minDate|break|html|else|maxDate||iFormat|id|getFullYear|class|document|getDate|format|drawYear|drawMonth||numMonths||charAt|||||_id|getMonth|jQuery|length|true|name|offset|showStatus|printDate|_adjustDate|monthNames|dayNames|for|_getInst|td|_defaults|dayNamesShort|match|_rangeStart|checkDate|firstDay|_currentYear|_currentDay|speed|xa0|documentElement|literal|_pos|lookAhead|shortYearCutoff|matches|_selectedDay|_currentMonth|css|iValue|_calId|_selectedMonth|isRTL|ctrlKey|_settings|isFixed|nodeName|position|_selectedYear|body|monthNamesShort|Math|size|rangeSelect|_endDay|_updateDatepicker|browser|_endYear|typeof|output|_getMinMaxDate|min|chars|dow|_addStatus|_disabledInputs|endDate|addClass|options|onclick|||_endMonth|pos|width|years|_dialogInput|inlineSettings|_inDialog|datepicker_trigger|apply|getTime|showAnim|onSelect|endYear|_drawYear|buttonText|_drawMonth|key|_hideDatepicker|dateStr|dates|period|max|_stayOpen|defaultDate|focus|scrollTop|stepMonths|100|obj|dateFormat|_inline|showOn|top|parseInt|otherMonth|markerClassName|scrollLeft|today|select|dateStatus|span|_datepickerShowing|removeClass|showOtherMonths|_lastInput|firstMon|event|status|left|_getNumberOfMonths|setDate|getDay|px|appendText|_showDatepicker|||||||||extendRemove|buttonImage|newMinDate|siblings|selectedDate|beforeShow|names|onClose|iso8601Week|datepicker_status_|switch|trigger|beforeShowDay|hideIfNoPrevNext|append|maxDraw|prompt|col|button|_getDaysInMonth|throw|blockUI|Datepicker|changeFirstDay|DatepickerInstance|_formatDate|showWeeks|Show|scrollY|the|string|type|_curInst|msie|clear|closeAtTop|scrollX|extend|selected|row|img|next|shortNames|longNames|clientWidth|DD|checkLiteral|option|wrapper|end|label|_selectingMonthYear||_getFormatConfig|val|inline|both|unbind|default|_selectDate|attr|getNumber|datepicker_daysCellOver|browserHeight|attrName|num|_inst|attrValue|disabled|calculateWeek|props|each|window|tr|browserWidth|dayNamesMin|clientHeight|bind|while|unselectable|height|_doKeyDown|getDaysInMonth|parseDate|datepicker_append|_setDate|rangeSeparator|chr|regional|_getDefaultDate|toLowerCase|opera|instSettings|_getDate|replaceWith|parents|_findPos|absolute|hidden|_tidyDialog|is|fixed|getName|formatNumber|formatName|_doKeyPress|at|calId|postProcess|keydown|keyCode|log|startDate|title|text|_clickMonthYear|number|currentDate|_canAdjustMonth|nextText|_gotoToday|prev|_selectMonthYear|secondary|controls|_selectDay|datepicker_currentDay|daySettings|dRow|style|leadDays|daysInMonth|iframe|src|prevText|_determineDate|formatDate|_clearDate|arguments|prototype|mandatory|otherArgs|_isInRange|object|inMaxYear|different|inMinYear|monthStatus|_|Select|yearRange|yearStatus|innerHeight|opacity|split|changeMonth|changeYear|_generateMonthYearHeader|datepicker_dialog|100px|initStatus|table|tbody|_nextId|_attachDatepicker|datepicker_cover|concat|onmouseover|version|debug|datepicker_div|innerWidth|_inlineDatepicker|keypress|checkRange|setData||getData|in|after|before|curMonth|buttonImageOnly|curYear|_connectDatepicker|_getFirstDayOfMonth|alt|_dialogInst|dateText|datepicker_rtl|datepicker_multi|_afterShow|map|datepicker_wrap|onmouseout|empty|show|charCode|minMax|May|_isDisabledDatepicker|_checkExternalClick|numberOfMonths|cursor|onchange|indexOf|replace|dayStatus|Invalid|Close|weekHeader|_changeFirstDay|clearStatus|current|offsetNumeric|offsetString|_generateDatepicker|iInit|isMultiMonth|getYear|clearText|prevStatus|_setDateFromField|try|closeText|closeStatus|catch|nextStatus|undefined|currentText|_possibleChars|currentStatus|_register|datepicker_prompt|statusForDate|thead|numRows|datepicker_unselectable|change|datepicker_weekEndCell|_setDateDatepicker|_changeDatepicker|_getDateDatepicker|Friday|Dec|Array|datepicker_control|Saturday|slice|call|x3c|Sun|Prev|exec|Nov|Sep|Apr|mousedown|datepicker_close|String|of|fromCharCode|Week|Sunday|Jun|Aug|Thursday|Mon|Jul|Wednesday|Monday|Tuesday|Oct|_enableDatepicker|console|Fr|hasDatepicker|Th|We|eval|getAttribute|setDefaults|ready|normal|as|mm|week|dd|yy|Sa|Set|Tu|err|Wk|_destroyDatepicker|Erase|Tue|isDisabled|first|without|Wed|Clear|Mo|fn|datepicker_clear|Su|Sat|Thu|Fri|_disableDatepicker|datepicker_inline|nextSibling|nodeType|datepicker_header|January|slideDown|fadeIn|February|slideUp|floor|datepicker_newMonth|ceil|Today|November|Missing|toString|October|86400000|fadeOut|hide|April|datepicker_status|remove|June|August|datepicker_today|datepicker_otherMonth|July|datepicker_daysCell|datepicker_weekCol|getTimezoneOffset|javascript|March|September|noWeekends|unblockUI|datepicker_daysRow|datepicker_newYear|weekStatus|0123456789|setMilliseconds|datepicker_current|setSeconds|_inlineShow|setHours|setMinutes|_dialogDatepicker|Feb|datepicker_links|wrap|Mar|datepicker_prev|datepicker_next|selectedIndex|click|datepicker_div_|datepicker_oneMonth|pageX|offsetWidth|December|Jan|9999|Unexpected|x3e|Next|Unknown|static|offsetHeight|datepicker_newRow|150|pageY|cellpadding|parentNode|datepicker_titleRow|cellspacing|previous'.split('|'),0,{}))
;﻿jQuery.metadata.setType('attr','data');

function dateOf(date) {
    var result = new Date(date);
    result.toString = function() { return $.datepicker.formatDate('dd-mm-yy', this); };
    return result;
}

function ajax(url, resultHandler) {
    $.ajax({
			type: "GET",
			url: url,
			beforeSend: function(xhr){
				xhr.setRequestHeader("Content-type", "application/json; charset=utf-8");
			},
			//contentType: "application/json; charset=utf-8",
			dataType: "json",
			success: resultHandler,
			error: function(XMLHttpRequest, textStatus, errorThrown){ }
		});
}

function PostDataToServer(serviceUrl, serviceData, async){
	if(typeof(serviceData)=='undefined')
		serviceData = '';
	if(typeof(async)=='undefined')
		async = true;
	$.ajax({
		type: "POST",
		url: serviceUrl,
		data: serviceData,
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
		dataType: "html",
		cache: false,
		success: function(msg){
			debug(msg);
		},
		error: function(msg){
			alert('Error !');
		},
		async: async
	});
}

function onAjaxSuccessAffiliate(table, tableTemplate, totalVisitsSpan) {
    return function(data) {
		$(totalVisitsSpan).find('b').html(data.VisitsSum);
        $(table).find('tbody').bindToTemplate(tableTemplate, data);
        $(table).trigger('update');
        $(table).trigger('sorton', [$(table).metadata().sortColumn]);
    }
}

function bindTableToTemplate(table, template) {
    return function(data) {
        $(table).find('tbody').bindToTemplate(template, data);
        $(table).trigger('update');
        $(table).trigger('sorton', [$(table).metadata().sortlist]);
    }
}


function valueOrDefault(value, defaultValue) {
    if (value !== undefined)
        return value;
    else
        return defaultValue;
}

jQuery.fn.bindToTemplate = function(templateElement, data, includes, settings) {
        var jQueryTemplateElement = $(templateElement);
		var s = jQueryTemplateElement.html();
		s = jQuery.trim(s);
		s = s.replace(/^<\!\[CDATA\[([\s\S]*)\]\]>$/im, '$1');
		
		jQuery(this).setTemplate(s, includes, settings);
		return jQuery(this).processTemplate(data);
	};

jQuery.extend({
	registerBehaviour: function(sheet) {
		jQuery(document).ready(function() {
							  		 for (selector in sheet) {
										jQuery(selector).each(function() { sheet[selector](this); });
									 }			
								});
	}
});

jQuery.registerBehaviour({
    'input.date-picker-control': function(element) {
        var datePickerData = $(element).metadata({name: 'date-picker-data'});
        
        $(element).datepicker({
				        rangeSelect: valueOrDefault(datePickerData.rangeSelect, true),
				        numberOfMonths: valueOrDefault(datePickerData.numberOfMonth, 3),
				        stepMonths: valueOrDefault(datePickerData.stepMonths, 3),
				        showOn: valueOrDefault(datePickerData.showOn, 'both'),
				        buttonImageOnly: valueOrDefault(datePickerData.buttonImageOnly, true),
				        buttonImage: valueOrDefault(datePickerData.buttonImage, url('~/images/calendar.gif')),
				        
				        onClose: function(dateRange, datePicker) {
				                    if (valueOrDefault(datePickerData.rangeSelect, true)) {
				                        if (datePicker._rangeStart) {
                                            var dateFrom = dateOf(datePicker._rangeStart);
				                            var dateTo = dateOf(new Date(datePicker._currentYear, datePicker._currentMonth, datePicker._currentDay));
				                            datePickerData.onClose(dateFrom, dateTo, datePicker);
				                        } else {
				                            datePickerData.onClose(dateOf(dateRange[0]), dateOf(dateRange[1]));
				                        }
				                    } else {
				                        datePickerData.onClose(dateOf(dateRange[0]), datePicker);
				                    }
				                 },
				                 
				        dateFormat: 'dd-mm-yy'
				    });	
    },
    
    '.ajax-updateable-region': function(element) {
        $(element).ajaxProgress();
    },
    
    '.sorted-table-with-pager': function(element) {
        $(element).find('.tablesorter').tablesorter({
								textExtraction: 'complex',//potrebno da zna "ogulit" link u celiji (npr. u visitsGrouped.asmx)
														  //tablesorter ga ne preporuca, jer je znatno sporiji!
						        widgets: ['zebra'],
						        dateFormat: 'uk'
						    }).tablesorterPager({
					                container: $(element).find('.pager'),
					                positionFixed: false
					            });
    }
});
;﻿masterScript = {
	callWebService: function(){
		var dates = $('#inputDatePicker') ? $('#inputDatePicker').val().split(' - ') : null;
		var resolution = $("input[@name=radioResolution][@checked]").val();

		var _clickType;
		if (typeof(clickType) != 'undefined'){
			_clickType = clickType;
		}
		else
			_clickType = $("input[@name=radioClickType][@checked]").val(); //pokusaj je pronaci u radio inputu

		var dateFrom, dateTo;
		if (dates.length == 2) {//raspon datuma
			dateFrom = dates[0];
			dateTo = dates[1];
		}
		else 
			dateFrom = dates; //jedan dan
		var parametersData = "?domain=" + domainID + "&dateFrom=" + dateFrom;
		if (dateTo) 
			parametersData += "&dateTo=" + dateTo;
		if (_clickType) 
			parametersData += "&clickType=" + _clickType;
		if (resolution) 
			parametersData += "&resolution=" + resolution;
		
		$.ajax({
			type: "GET",
			url: mainScript.serviceUrl + parametersData,
			beforeSend: function(xhr){
				xhr.setRequestHeader("Content-type", "application/json; charset=utf-8");
			},
			//contentType: "application/json; charset=utf-8",
			dataType: "json",
			success: function(response){
				responseClickData = response.clickData;
				var tmpValue;
				var newTableBody = new Array();
				newTableBody.push('<tbody>');
				$(responseClickData).each(function(responseIndex){
					newTableBody.push('<tr>');
					//console.log(responseClickData[responseIndex]);
					for (element in responseClickData[responseIndex]) {
						tmpValue = responseClickData[responseIndex][element].toString();
						if(tmpValue.indexOf("www") == 0)	//ako je link, lijepi html anchor
							tmpValue = "<a href=http://" + tmpValue + " target=_blank>" + tmpValue + "</a>"
						newTableBody.push('<td>' + tmpValue + '</td>');
					}
					
					newTableBody.push('</tr>');
				})

				newTableBody.push('</tbody>');
				newTableBody = newTableBody.join('');
				//console.log(newTableBody);
				
				$($('#table1 tbody')).replaceWith(newTableBody);

				if ($('#graph').length > 0) { //ako nadje flash kontejner u DOMu
					$('#table1').graphPlotter();
				}

				//ako nema podataka u odgovoru skriva pager
				if (responseClickData == null || responseClickData == '') {
					$('#pager').css({
						display: "none"
					});
					return;
				}
				else {
					$('#pager').css({
						display: "block"
					});
				}
				//ako nema podataka u odgovoru skriva pager

				//updata tablesorter skriptu
				$("#table1").trigger("update");
				$("#table1").trigger("sorton", mainScript.tableSortingcolumn);
				//updata tablesorter skriptu		
				
				if(typeof(mainScript.onAjaxSuccess) != 'undefined')
					mainScript.onAjaxSuccess(response);
			},
			
			error: function(XMLHttpRequest, textStatus, errorThrown){
				if ($(XMLHttpRequest.responseText)[0] != null) 
					alert($(XMLHttpRequest.responseText)[0].innerHTML); //alertam title error poruke
				else 
					alert(XMLHttpRequest.responseText)
			}
		});
	}
};﻿/**
 * GoHome Script
 * Crta animirani gif preko kontrole koja ceka podatke ajaxom
 * 
 * prima settings objekt sa parametrima:
 * 
 */
(function($) {
	$.extend({
		ajaxProgress: new function(){
			this.defaults = {
								
							};
			
			this.construct = function(settings){
				return this.each(function(){
					
					if(this.progressConfig == null)
						this.progressConfig = {};
					
					progressConfig = $.extend(this.progressConfig, $.ajaxProgress.defaults, settings);

					$(this).ajaxStart(function(){
						
					    var $this = $(this);
					
					    var coverDiv = $('<div class="JQueryAjaxLoadingDiv"></div>');
					
					    coverDiv.css({
					                    "background-color": "#D5D5D5",
					                    "background-image": "url('" + url("~/images/ajaxLoading.gif") + "')",
					                    "background-position": "center center",
					                    "background-repeat": "no-repeat",
					                    "position": "absolute",
					    
					                    left: $this.offset().left,
					                    top: $this.offset().top,
					                    width: $this.width(),
					                    height: $this.height(),
					                    opacity: 0
					                  });
					
					    coverDiv.appendTo("body").animate( { opacity:0.7}, 500 );   //dodaje ga u DOM i radi fade in
					 });
					 
					$(this).ajaxComplete(function(request, settings){
					    $('.JQueryAjaxLoadingDiv').stop().animate( { opacity:0}, 500, function(){  //zaustavlja sve animacije i radi fade out, pa remove iz DOM-a
					                                                        $('.JQueryAjaxLoadingDiv').remove();
					                                                    } )
					 });
  
				});
			};
			
		}});
			
	$.fn.extend({
        ajaxProgress: $.ajaxProgress.construct
	});			
})(jQuery);;﻿/**
 * GoHome Script
 * Crta OpenFlash graf iz HTML table
 * 
 * prima settings objekt sa parametrima:
 * String openFlashChartPath - 		putanja do swf datoteke
 * String graphType - 				tip grafa, vrijednosti : 'line' || 'pie'
 * String graphContainer - 			id HTML div-a u kojem se crta graf
 * 
 * int xValuesColumn - 				redni broj kolone HTML tablice koja predstavlja x os vrijednosti grafa (1 je prva kolona(ne 0)!)
 * int yValuesColumn - 				redni broj kolone HTML tablice koja predstavlja y os vrijednosti grafa (1 je prva kolona(ne 0)!)
 * String radioResolutionName - 	name radio botuna koji definiraju rezoluciju (dan, tjedan, mjesec)
 * int domainID - 					id domene - potreban za link na detaljne klikove
 * String clickType - 				tip klika - moguce vrijednosti: 'All' || 'Free' || 'Paid'
 * String clickTypeText - 			tekstualni zapis tipa klika, za ispis na stranici
 * graphMaxXSingleLabels - 			maksimalni broj labela na x osi za pojedinacni element
 * graphMaxXDoubleLabels - 			maksimalni broj labela na x osi za range
 * bg_colour - 						boja pozadine
 * title - 							naslov grafa
 * lineGraphBgImg - 				path slike za pozadinu linijskog grafa
 */
(function($) {
	$.extend({
		graphPlotter: new function(){
			this.defaults = {
								graphMaxXSingleLabels: 7,
								graphMaxXDoubleLabels: 4,
								bg_colour: '#D5D5D5',
								title: ''
							};
			
			this.construct = function(settings){
				return this.each(function(){
					if(this.graphConfig == null)
						this.graphConfig = {};
					
					graphConfig = $.extend(this.graphConfig, $.graphPlotter.defaults, settings);

					if($('#' + graphConfig.graphContainer).length == 0)//ako ne nadje container u DOM-u prekida
						return;

					var dataLabels = new Array();
					var dataValues = new Array();
					var resolution = $("input[@name=" + graphConfig.radioResolutionName + "][@checked]").val();
					var linksValues = null;
					if (resolution == "Day") 
						linksValues = new Array();
					var maxValue = 0;
					
					var tableColumnLabels = $(this).find("tbody tr td:nth-child(" + graphConfig.xValuesColumn + ")");
					var tableColumnValues = $(this).find("tbody tr td:nth-child(" + graphConfig.yValuesColumn + ")");
					
					var tmpsum = 0;
					var sum = 0;
					tableColumnValues.each(function(i, val){
						sum += parseInt($(tableColumnValues[i]).text())
					})
					
					var percentage;
					if (tableColumnValues.length > 100) 
						percentage = 100;
					else 
						percentage = 20;
					
					var columnValue;
					for (var i = 0; i < tableColumnLabels.length; i++) {
						columnValue = parseInt($(tableColumnValues[i]).text());
						columnLabel = $(tableColumnLabels[i]).text();
						
						dataValues[dataValues.length] = columnValue;
						tmpsum += columnValue;
						
						dataLabels[dataLabels.length] = columnLabel;
						
						if (linksValues != null) //klikom ide na stranicu detaljnih klikova samo ako je trenutna rezolucija dan
							linksValues[linksValues.length] = 'ClicksDetails.asmx' +
							    '%3fdomain%3d' + 
							    graphConfig.domainID +
							    '%26clickType%3d' +
							    graphConfig.clickType +
							    '%26date%3d' +
							    columnLabel +
							    '%26backUrl%3d' +
							    escape(location.href);
						if (columnValue > maxValue) 
							maxValue = columnValue;
						
						if (graphConfig.graphType == 'pie' && sum / columnValue > percentage) {
							dataValues[dataValues.length] = sum - tmpsum;
							dataLabels[dataLabels.length] = 'ostali';
							break;
						}
					};
					var step = getStep(this, dataLabels.length, resolution);

					while (maxValue % 3 != 0) {
						maxValue++;
					}
					
					var lineColor;
					if (typeof(graphConfig.clickType) != 'undefined') {
						switch (graphConfig.clickType) {
							case 'All':
								lineColor = '#a31018';
								break;
							case 'Paid':
								lineColor = '#669900';
								break;
							case 'Free':
								lineColor = '#3399CC';
								break;
							default:
								lineColor = '#a31018';
								break;
						}
					}

					var so = new SWFObject(graphConfig.openFlashChartPath, "ofc", "100%", "100%", "9", "#FFFFFF");
					so.addParam("wmode", "transparent");
					so.addParam("quality", "high");
					so.addVariable("variables", "true");
					so.addVariable("values", dataValues);//vrijednosti y-os
					so.addVariable("title", graphConfig.title + ',{font-size: 20; color:#666666; text-align:right; padding-right:30 }');
					so.addVariable("allowScriptAccess", 'always');
					so.addVariable("bg_colour", graphConfig.bg_colour);//zablinka pri ucitavanju

					if (graphConfig.graphType == 'line') {
						so.addVariable("x_labels", dataLabels); //vrijednosti x-os
						so.addVariable("y_max", maxValue);
						if(linksValues != null)
							so.addVariable("links", linksValues);
						so.addVariable("tool_tip", '#key#: #val# <br>'+ graphConfig.dateLocalized + ': #x_label#');
						so.addVariable("line", '3,' + lineColor + ',' + graphConfig.clickTypeText + ',10,5');//tip grafa
						so.addVariable("bg_image", graphConfig.lineGraphBgImg);
						so.addVariable("bg_image_x", 'center');
						so.addVariable("bg_image_y", 'middle');
						so.addVariable("x_axis_colour", '#000000');
						so.addVariable("y_axis_colour", '#000000');
						so.addVariable("x_grid_colour", '#CCCCCC');
						so.addVariable("y_grid_colour", '#CCCCCC');
						so.addVariable("x_label_style", '10,#000000,0,' + step + ',#999999');// size, color, direction, step, vertical-line color
						so.addVariable("x_axis_steps", step);//okomite crte
						so.addVariable("y_label_size", '14');
						so.addVariable("y_ticks", '5,10,3');
						so.addVariable("is_thousand_separator_disabled", 'true');
					}
					else {
						so.addVariable("pie", '60,#FFFFFF,{font-size: 12px; color: #404040; display: none}');//tip grafa
						so.addVariable("pie_labels", dataLabels);
						so.addVariable("colours", '#A31018,#669900,#3399CC, #FFCC00');
						so.addVariable("tool_tip", graphConfig.repeatLocalized + ': #val# <br>#x_label#');
					}
					so.write(graphConfig.graphContainer);
				});
			};
			
			function getStep(table, xElements, resolution){
				var graphConfig = table.graphConfig;
				var maxLabels = graphConfig.graphMaxXSingleLabels;
				if (resolution == "Week" || resolution == "Month") 
					maxLabels = graphConfig.graphMaxXDoubleLabels;
				if(maxLabels == 2)//ako se traze samo dvije labele, podesava step da prikaze samo prvu i zadnju
					return xElements - 1;
				var step = parseInt((xElements - 1) / maxLabels) + 1
				return step;
			}
			
		}});
			
	$.fn.extend({
        graphPlotter: $.graphPlotter.construct
	});			
})(jQuery);;