function Browser() {

    var ua, s, i;

    this.isIE = false;
    this.isNS = false;
    this.version = null;

    ua = navigator.userAgent;

    s = "MSIE";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isIE = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    s = "Netscape6/";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    // Treat any other "Gecko" browser as NS 6.1.

    s = "Gecko";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = 6.1;
        return;
    }
}

var browser = new Browser();

// Global object to hold drag information.

var dragObj = new Object();
dragObj.zIndex = 0;

function dragStart(event, id) {

    var el;
    var x, y;

    // If an element id was given, find it. Otherwise use the element being
    // clicked on.

    if (id)
        dragObj.elNode = document.getElementById(id);
    else {
        if (browser.isIE)
            dragObj.elNode = window.event.srcElement;
        if (browser.isNS)
            dragObj.elNode = event.target;

        // If this is a text node, use its parent element.

        if (dragObj.elNode.nodeType == 3)
            dragObj.elNode = dragObj.elNode.parentNode;
    }

    // Get cursor position with respect to the page.

    if (browser.isIE) {
        x = window.event.clientX + document.documentElement.scrollLeft
            + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
            + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }

    // Save starting positions of cursor and element.

    dragObj.cursorStartX = x;
    dragObj.cursorStartY = y;
    dragObj.elStartLeft = parseInt(dragObj.elNode.style.left, 10);
    dragObj.elStartTop = parseInt(dragObj.elNode.style.top, 10);

    if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
    if (isNaN(dragObj.elStartTop)) dragObj.elStartTop = 0;

    // Update element's z-index.

    dragObj.elNode.style.zIndex = ++dragObj.zIndex;

    // Capture mousemove and mouseup events on the page.

    if (browser.isIE) {
        document.attachEvent("onmousemove", dragGo);
        document.attachEvent("onmouseup", dragStop);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS) {
        document.addEventListener("mousemove", dragGo, true);
        document.addEventListener("mouseup", dragStop, true);
        event.preventDefault();
    }
}

function dragGo(event) {

    var x, y;

    // Get cursor position with respect to the page.

    if (browser.isIE) {
        x = window.event.clientX + document.documentElement.scrollLeft
            + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
            + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }

    // Move drag element by the same amount the cursor has moved.

    dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
    dragObj.elNode.style.top = (dragObj.elStartTop + y - dragObj.cursorStartY) + "px";

    if (browser.isIE) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS)
        event.preventDefault();
}

function dragStop(event) {

    // Stop capturing mousemove and mouseup events.

    if (browser.isIE) {
        document.detachEvent("onmousemove", dragGo);
        document.detachEvent("onmouseup", dragStop);
    }
    if (browser.isNS) {
        document.removeEventListener("mousemove", dragGo, true);
        document.removeEventListener("mouseup", dragStop, true);
    }
}


/*
* jQuery scrollsync Plugin
* version: 1.0 (30 -Jun-2009)
* Copyright (c) 2009 Miquel Herrera
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
*/
; (function ($) { // secure $ jQuery alias

    /**
    * Synchronizes scroll of one element (first matching targetSelector filter)
    * with all the rest meaning that the rest of elements scroll will follow the 
    * matched one.
    * 
    * options is composed of the following properties:
    *	------------------------------------------------------------------------
    *	targetSelector	| A jQuery selector applied to filter. The first element of
    *					| the resulting set will be the target all the rest scrolls
    *					| will be synchronised against. Defaults to ':first' which 
    *					| selects the first element in the set.
    *	------------------------------------------------------------------------
    *	axis			| sets the scroll axis which will be synchronised, can be
    *					| x, y or xy. Defaults to xy which will synchronise both.
    *	------------------------------------------------------------------------
    */
    $.fn.scrollsync = function (options) {
        var settings = $.extend(
			{
			    targetSelector: ':first',
			    axis: 'xy'
			}, options || {});


        function scrollHandler(event) {
            if (event.data.xaxis) {
                event.data.followers.scrollLeft(event.data.target.scrollLeft());
            }
            if (event.data.yaxis) {
                event.data.followers.scrollTop(event.data.target.scrollTop());
            }
        }

        // Find target to follow and separate from followers
        settings.target = this.filter(settings.targetSelector).filter(':first');
        settings.followers = this.not(settings.target); // the rest of elements

        // Parse axis
        settings.xaxis = (settings.axis == 'xy' || settings.axis == 'x') ? true : false;
        settings.yaxis = (settings.axis == 'xy' || settings.axis == 'y') ? true : false;
        if (!settings.xaxis && !settings.yaxis) return;  // No axis left 

        // bind scroll event passing array of followers
        settings.target.bind('scroll', settings, scrollHandler);

    }; // end plugin scrollsync

})(jQuery); // confine scope




/*
* jQuery dragscrollable Plugin
* version: 1.0 (25-Jun-2009)
* Copyright (c) 2009 Miquel Herrera
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
*/
; (function ($) { // secure $ jQuery alias

    /**
    * Adds the ability to manage elements scroll by dragging
    * one or more of its descendant elements. Options parameter
    * allow to specifically select which inner elements will
    * respond to the drag events.
    * 
    * options properties:
    * ------------------------------------------------------------------------		
    *  dragSelector         | jquery selector to apply to each wrapped element 
    *                       | to find which will be the dragging elements. 
    *                       | Defaults to '>:first' which is the first child of 
    *                       | scrollable element
    * ------------------------------------------------------------------------		
    *  acceptPropagatedEvent| Will the dragging element accept propagated 
    *	                     | events? default is yes, a propagated mouse event 
    *	                     | on a inner element will be accepted and processed.
    *	                     | If set to false, only events originated on the
    *	                     | draggable elements will be processed.
    * ------------------------------------------------------------------------
    *  preventDefault       | Prevents the event to propagate further effectivey
    *                       | dissabling other default actions. Defaults to true
    * ------------------------------------------------------------------------
    *  
    *  usage examples:
    *
    *  To add the scroll by drag to the element id=viewport when dragging its 
    *  first child accepting any propagated events
    *	$('#viewport').dragscrollable(); 
    *
    *  To add the scroll by drag ability to any element div of class viewport
    *  when dragging its first descendant of class dragMe responding only to
    *  evcents originated on the '.dragMe' elements.
    *	$('div.viewport').dragscrollable({dragSelector:'.dragMe:first',
    *									  acceptPropagatedEvent: false});
    *
    *  Notice that some 'viewports' could be nested within others but events
    *  would not interfere as acceptPropagatedEvent is set to false.
    *		
    */
    $.fn.dragscrollable = function (options) {

        var settings = $.extend(
		{
		    dragSelector: '>:first',
		    acceptPropagatedEvent: true,
		    preventDefault: true
		}, options || {});


        var dragscroll = {
            mouseDownHandler: function (event) {
                // mousedown, left click, check propagation
                if (event.which != 1 ||
				(!event.data.acceptPropagatedEvent && event.target != this)) {
                    return false;
                }

                // Initial coordinates will be the last when dragging
                event.data.lastCoord = { left: event.clientX, top: event.clientY };

                $.event.add(document, "mouseup",
						 dragscroll.mouseUpHandler, event.data);
                $.event.add(document, "mousemove",
						 dragscroll.mouseMoveHandler, event.data);
                if (event.data.preventDefault) {
                    event.preventDefault();
                    return false;
                }
            },
            mouseMoveHandler: function (event) { // User is dragging
                // How much did the mouse move?
                var delta = { left: (event.clientX - event.data.lastCoord.left),
                    top: (event.clientY - event.data.lastCoord.top)
                };

                // Set the scroll position relative to what ever the scroll is now
                event.data.scrollable.scrollLeft(
							event.data.scrollable.scrollLeft() - delta.left);
                event.data.scrollable.scrollTop(
							event.data.scrollable.scrollTop() - delta.top);

                // Save where the cursor is
                event.data.lastCoord = { left: event.clientX, top: event.clientY }
                if (event.data.preventDefault) {
                    event.preventDefault();
                    return false;
                }

            },
            mouseUpHandler: function (event) { // Stop scrolling
                $.event.remove(document, "mousemove", dragscroll.mouseMoveHandler);
                $.event.remove(document, "mouseup", dragscroll.mouseUpHandler);
                if (event.data.preventDefault) {
                    event.preventDefault();
                    return false;
                }
            }
        }

        // set up the initial events
        this.each(function () {
            // closure object data for each scrollable element
            var data = { scrollable: $(this),
                acceptPropagatedEvent: settings.acceptPropagatedEvent,
                preventDefault: settings.preventDefault
            }
            // Set mouse initiating event on the desired descendant
            $(this).find(settings.dragSelector).
						bind('mousedown', data, dragscroll.mouseDownHandler);
        });
    }; //end plugin dragscrollable

})(jQuery); // confine scope







/*
* Jquery jqDraw plugin V1.0
* Written by Ejder Yurdakul 03/01/2011
* http://freelancephp.be
* Description This plugin gives user ability to draw in a DOM element.
* params:
* options.color: color of the line
* options.thickness: width of the line 
* returns void
*/
//debug script
/*(function($) {
$.fn.draw = function(options) {
if(typeof options == "string"){
switch(options){
case "reset":
var h = $("#jqdraw-target", this).height();
$("#jqdraw-target").attr("height", h-1);
$("#jqdraw-target").attr("height", h);
break;
case "disable":
$("#jqdraw-target", this).addClass("jqdraw-disabled");
break;
case "enable":
$("#jqdraw-target", this).removeClass("jqdraw-disabled");
break;
default:
return false;
break;
}
}else{
var opts = $.extend({}, $.fn.draw.defaults, options);
var _el = this;
var _pos = this.offset();
this.empty();
var jqcanvas = $("<canvas/>").attr({
"width": this.width(),
"height": this.height(),
"id":"jqdraw-target"
}).appendTo(this);
var canvas = document.getElementById("jqdraw-target");
var context = canvas.getContext("2d");
context.strokeStyle = opts.color;
			
var startDraw = false;
$(document).mousemove(function(e){
if(e.target.getAttribute("id") == "jqdraw-target"){
if(!startDraw){
startDraw = true;
context.beginPath();
context.moveTo((e.clientX-_pos.left), (e.clientY-_pos.top));
}else{
context.lineTo((e.clientX-_pos.left), (e.clientY-_pos.top));
context.stroke();
}
}else{
if(startDraw){
startDraw = false;
context.closePath();
}
}
});
}
};
})(jQuery);
$.fn.draw.defaults = {
color: "#000000",
thickness: 2.0
};*/
//minified script
(function ($) { $.fn.draw = function (op) { if (typeof op == "string") { switch (op) { case "reset": var h = $("#jqdraw-target", this).height(); $("#jqdraw-target").attr("height", h - 1); $("#jqdraw-target").attr("height", h); break; case "disable": $("#jqdraw-target", this).addClass("jqdraw-disabled"); break; case "enable": $("#jqdraw-target", this).removeClass("jqdraw-disabled"); break; default: return false; break; } } else { var o = $.extend({}, $.fn.draw.defaults, op); var _e = this; var _p = this.offset(); this.empty(); var jqcanvas = $("<canvas/>").attr({ "width": this.width(), "height": this.height(), "id": "jqdraw-target" }).appendTo(this); var c = document.getElementById("jqdraw-target"); var ct = c.getContext("2d"); ct.strokeStyle = o.color; var sd = false; $(document).mousemove(function (e) { if (!$("#jqdraw-target").is(".jqdraw-disabled")) { if (e.target.getAttribute("id") == "jqdraw-target") { if (!sd) { sd = true; ct.beginPath(); ct.moveTo((e.clientX - _p.left), (e.clientY - _p.top)); } else { ct.lineTo((e.clientX - _p.left), (e.clientY - _p.top)); ct.stroke(); } } else { if (sd) { sd = false; ct.closePath(); } } } }); } }; })(jQuery); $.fn.draw.defaults = { color: "#000000", thickness: 2.0 };












