From: Maxious Date: Sun, 16 Sep 2012 08:29:56 +0000 Subject: continues javascritps X-Git-Url: https://maxious.lambdacomplex.org/git/?p=disclosr.git&a=commitdiff&h=c79bbda37875a23f8390150b8258787f48f1dad3 --- continues javascritps Former-commit-id: 31e80cd42c85bb329a75fbfe6689bf866e14de9e --- --- a/.gitmodules +++ b/.gitmodules @@ -10,16 +10,19 @@ [submodule "lib/Requests"] path = lib/Requests url = https://github.com/rmccue/Requests.git -[submodule "javascripts/flotr2"] - path = javascripts/flotr2 +[submodule "js/flotr2"] + path = js/flotr2 url = https://github.com/HumbleSoftware/Flotr2.git [submodule "lib/phpquery"] path = lib/phpquery url = https://github.com/TobiaszCudnik/phpquery.git -[submodule "javascripts/sigma"] - path = javascripts/sigma +[submodule "js/sigma"] + path = js/sigma url = https://github.com/jacomyal/sigma.js.git -[submodule "javascripts/bubbletree"] - path = javascripts/bubbletree +[submodule "js/bubbletree"] + path = js/bubbletree url = https://github.com/okfn/bubbletree.git +[submodule "lib/querypath"] + path = lib/querypath + url = https://github.com/technosophos/querypath.git --- a/about.php +++ b/about.php @@ -1,6 +1,6 @@

About/FAQ

@@ -8,8 +8,9 @@

What is this?

Disclo.gs is a project to monitor Australian Federal Government agencies -compliance with their "proactive disclosure requirements". - +compliance with their "proactive disclosure requirements" to make a transparency league table as suggested by gov2 taskforce http://gov2.net.au/blog/2009/09/19/a-league-ladder-of-psi-openness/. +

Attributions

+National Archives of Australia, Australian Governments’ Interactive Functions Thesaurus, 2nd edition, September 2005, published at http://www.naa.gov.au/recordkeeping/thesaurus/index.htm.

Open everything

All documents released CC-BY 3 AU --- /dev/null +++ b/admin/agls.php @@ -1,1 +1,35 @@ + + namefunction"; +$db = $server->get_db('disclosr-agencies'); +try { + $agencies = $db->get_view("app", "byCanonicalName", null, true)->rows; + + + if ($agencies) { + foreach ($agencies as $row) { + + echo "" . $row->value->name . ""; + if (isset($row->value->metaTags)) { + if (is_array($row->value->metaTags)) { + $tags =$row->value->metaTags; + } else { + $tags = object_to_array($row->value->metaTags); + } + if (isset($tags['AGLS.Function'])) { + echo "" . $tags['AGLS.Function'] . ""; + } + } + echo ""; + } + } +} catch (SetteeRestClientException $e) { + setteErrorHandler($e); +} +include_footer(); +?> + --- a/admin/conflicts.php +++ b/admin/conflicts.php @@ -1,7 +1,7 @@ get_db('disclosr-agencies'); + +try { + $agencies = $db->get_view("app", "byCanonicalName", null, true)->rows; + //print_r($rows); + foreach ($agencies as $agency) { + //echo $agency->value->name . " ".$agency->value->website."
\n"; + // print_r($agency); + //hasRestricitiveLicence" hasRestrictiveLicense -> has Restrictive Licence + // "hasYoutube" -> Tube + // "comment" -> "comments" + if (!isset($agency->value->metaTags) && isset($agency->value->website)) { + echo $agency->value->name . " ".$agency->value->website."
\n"; + $agency->value->metaTags = Array(); + $request = Requests::get($agency->value->website); + $html = phpQuery::newDocumentHTML($request->body); + phpQuery::selectDocument($html); + foreach (pq('meta')->elements as $meta) { + $tagName = $meta->getAttribute('name');; + $content = $meta->getAttribute('content'); + if ($tagName != "") { +echo "$tagName == $content
\n"; + $agency->value->metaTags[$tagName] = $content; + } + } + //print_r($agency->value->metaTags); + $db->save($agency->value); + echo "
"; + flush(); + } + } +} catch (SetteeRestClientException $e) { + setteErrorHandler($e); +} +?> + --- /dev/null +++ b/admin/naa-agift-tree.php @@ -1,1 +1,2504 @@ + + + + Demo of the tree layout in D3.js + + + + + +
+
+ + + + + + + + + + --- /dev/null +++ b/admin/naa-agift.json @@ -1,1 +1,2232 @@ - +[ + "Home", + "index.htm", + [ + "BUSINESS SUPPORT AND REGULATION", + "000411.htm", + [ + "Association registration", + "000396.htm" + ], + [ + "Business process auditing", + "000413.htm" + ], + [ + "Business registration and licensing", + "000414.htm" + ], + [ + "Business sponsorship", + "001371.htm" + ], + [ + "Consumer protection", + "000439.htm" + ], + [ + "Fair trading compliance", + "000482.htm", + [ + "Prices surveillance", + "000533.htm" + ], + [ + "Product safety", + "000534.htm" + ], + [ + "Trade practices compliance", + "000583.htm" + ] + ], + [ + "Financial institutions regulation", + "000485.htm" + ], + [ + "Government procurement regulation", + "000491.htm" + ], + [ + "Industry assistance schemes", + "000499.htm" + ], + [ + "Industry development", + "000500.htm" + ], + [ + "Insurance regulation", + "000501.htm", + [ + "General insurance", + "000489.htm" + ], + [ + "Life insurance", + "000505.htm" + ] + ], + [ + "Professional accreditation", + "000535.htm" + ], + [ + "Small business services", + "000565.htm", + [ + "Small business advocacy", + "000563.htm" + ], + [ + "Small business development", + "000564.htm" + ] + ], + [ + "Stock market regulation", + "000572.htm" + ] + ], + [ + "CIVIC INFRASTRUCTURE", + "000424.htm", + [ + "Civic management", + "000425.htm", + [ + "Architectural services", + "000387.htm" + ], + [ + "Building approval services", + "000406.htm" + ], + [ + "Building regulations and standards", + "000408.htm" + ], + [ + "Engineering services", + "000477.htm" + ], + [ + "Town planning", + "000582.htm" + ] + ], + [ + "Energy supply", + "000476.htm" + ], + [ + "Integrated services planning", + "000503.htm" + ], + [ + "Public housing", + "000536.htm", + [ + "Public housing construction", + "000537.htm" + ], + [ + "Public housing design", + "000538.htm" + ], + [ + "Public housing maintenance", + "000540.htm" + ] + ], + [ + "Public land management", + "000541.htm", + [ + "Burial ground management", + "000410.htm" + ], + [ + "Cultural centre management", + "000444.htm" + ], + [ + "Garden management", + "000488.htm" + ], + [ + "Memorial maintenance", + "000509.htm" + ], + [ + "Recreational park management", + "000549.htm" + ], + [ + "Sporting facilities management", + "000571.htm" + ] + ], + [ + "Regional development", + "000552.htm" + ], + [ + "Transport network maintenance", + "000586.htm" + ], + [ + "Waste management", + "001349.htm" + ] + ], + [ + "COMMUNICATIONS", + "000433.htm", + [ + "Advertising standards", + "000381.htm" + ], + [ + "Broadcasting", + "000403.htm", + [ + "Broadcasting standards", + "000404.htm" + ], + [ + "Radio broadcasting", + "000546.htm" + ], + [ + "Television broadcasting", + "000580.htm" + ] + ], + [ + "Call centre administration", + "000417.htm" + ], + [ + "Electronic commerce", + "000468.htm", + [ + "Authentication", + "000399.htm" + ], + [ + "Online transaction standards", + "000526.htm" + ] + ], + [ + "Government media", + "000490.htm" + ], + [ + "Information management standards", + "000283.htm", + [ + "Data management", + "000448.htm" + ], + [ + "Information dissemination", + "000502.htm" + ], + [ + "Information technology standards", + "000282.htm" + ] + ], + [ + "Media ownership regulation", + "000508.htm" + ], + [ + "Postal services", + "000530.htm", + [ + "Courier services", + "000441.htm" + ], + [ + "Electronic postal services", + "000469.htm" + ], + [ + "Retail postal services", + "000554.htm" + ] + ], + [ + "Publishing", + "000543.htm", + [ + "Electronic publishing", + "000470.htm" + ], + [ + "Publishing standards", + "000544.htm" + ], + [ + "Website development", + "000591.htm" + ] + ], + [ + "Radio communication", + "000547.htm", + [ + "Apparatus licensing", + "000385.htm" + ], + [ + "Spectrum management", + "000570.htm" + ] + ], + [ + "Satellite communication", + "000560.htm" + ], + [ + "Telecommunications", + "000578.htm", + [ + "Carriage service providers", + "000420.htm" + ], + [ + "Carrier licensing", + "000421.htm" + ], + [ + "Equipment licensing", + "000480.htm" + ], + [ + "Mobile telephone services", + "000516.htm" + ], + [ + "Telephone services", + "000579.htm" + ] + ] + ], + [ + "COMMUNITY SERVICES", + "000435.htm", + [ + "Accommodation services", + "000377.htm", + [ + "Defence housing", + "000458.htm" + ], + [ + "Emergency accommodation", + "000471.htm" + ], + [ + "Public housing entitlements", + "000539.htm" + ], + [ + "Refuge support", + "000551.htm" + ] + ], + [ + "Community support", + "000436.htm", + [ + "Adoption services", + "000378.htm" + ], + [ + "Aged care services", + "000382.htm" + ], + [ + "Child and youth support", + "000422.htm" + ], + [ + "Child-care services", + "000423.htm" + ], + [ + "Defence community programs", + "000452.htm" + ], + [ + "Family reunion programs", + "000483.htm" + ], + [ + "Veterans\" entitlements", + "000587.htm" + ] + ], + [ + "Counselling services", + "000440.htm" + ], + [ + "Emergency services", + "000474.htm", + [ + "Ambulance services", + "000384.htm" + ], + [ + "Emergency funding", + "000472.htm" + ], + [ + "Firefighting services", + "000487.htm" + ] + ], + [ + "Financial assistance", + "000484.htm", + [ + "Benefits", + "000402.htm" + ], + [ + "Income support schemes", + "000494.htm" + ] + ], + [ + "Natural disasters", + "000521.htm", + [ + "Disaster recovery", + "000462.htm" + ], + [ + "Disaster relief", + "000463.htm" + ] + ], + [ + "Rural community development", + "000557.htm" + ], + [ + "Social justice and equity", + "000566.htm" + ], + [ + "Transport access schemes", + "000901.htm" + ] + ], + [ + "CULTURAL AFFAIRS", + "000442.htm", + [ + "Arts development", + "000391.htm", + [ + "Arts funding", + "000393.htm" + ], + [ + "Arts incentive schemes", + "000394.htm" + ], + [ + "Arts promotion", + "000395.htm" + ] + ], + [ + "Collection access", + "000427.htm", + [ + "Descriptive standards", + "000461.htm" + ], + [ + "Finding aids development", + "000486.htm" + ], + [ + "Reference services", + "000550.htm" + ] + ], + [ + "Collection management", + "000430.htm", + [ + "Artefact export regulation", + "000390.htm" + ], + [ + "Collection accessioning", + "000428.htm" + ], + [ + "Collection acquisition", + "000429.htm" + ], + [ + "Collection storage", + "000432.htm" + ], + [ + "Preservation services", + "000532.htm" + ] + ], + [ + "Collection promotion", + "000431.htm", + [ + "Exhibition programs", + "000481.htm" + ], + [ + "Publicity programs", + "000542.htm" + ] + ], + [ + "Cultural awards and scholarships", + "000443.htm" + ], + [ + "Cultural festivals", + "000445.htm" + ], + [ + "Cultural gifts programs", + "000446.htm" + ], + [ + "Multicultural heritage promotion", + "000518.htm", + [ + "Multicultural festivals", + "000517.htm" + ], + [ + "Multicultural services", + "000519.htm" + ] + ] + ], + [ + "DEFENCE", + "000449.htm", + [ + "Australian Defence Forces", + "000397.htm", + [ + "Air Force", + "002266.htm" + ], + [ + "Army", + "000388.htm" + ], + [ + "Badges and insignia", + "000401.htm" + ], + [ + "Cadets", + "000416.htm" + ], + [ + "Defence force commands", + "000456.htm" + ], + [ + "Military bands", + "000510.htm" + ], + [ + "Navy", + "000524.htm" + ], + [ + "Reserves", + "000553.htm" + ], + [ + "Roulettes", + "000556.htm" + ] + ], + [ + "Defence estate management", + "000454.htm" + ], + [ + "Defence force careers", + "000455.htm", + [ + "Defence career development", + "000450.htm" + ], + [ + "Military employment services", + "000512.htm" + ] + ], + [ + "Defence strategic development", + "000574.htm", + [ + "Defence efficiency review", + "000453.htm" + ], + [ + "Defence reform program", + "000460.htm" + ] + ], + [ + "Defence strategic policy", + "000576.htm", + [ + "Strategic decisions", + "000573.htm" + ], + [ + "Strategic planning", + "000575.htm" + ] + ], + [ + "Defence strategic support", + "000577.htm", + [ + "Capital equipment programs", + "000419.htm" + ], + [ + "Defence industry", + "000459.htm" + ], + [ + "Defence science and technology", + "000905.htm" + ], + [ + "Logistics", + "000506.htm" + ] + ], + [ + "Emergency management", + "000473.htm", + [ + "Civil community assistance", + "000426.htm" + ], + [ + "Disaster support", + "000464.htm" + ] + ], + [ + "Military law", + "001814.htm" + ], + [ + "Military operations", + "000515.htm", + [ + "Australian theatre of war", + "000398.htm" + ], + [ + "Military exercises", + "000514.htm" + ], + [ + "Special operations", + "000569.htm" + ], + [ + "Warfare", + "000589.htm" + ] + ] + ], + [ + "EDUCATION AND TRAINING", + "000467.htm", + [ + "Arts education", + "000392.htm" + ], + [ + "Community education", + "000434.htm", + [ + "Adult education programs", + "000379.htm" + ], + [ + "Adult migrant education", + "000380.htm" + ], + [ + "Road safety awareness", + "000555.htm" + ] + ], + [ + "Curriculum development", + "000447.htm" + ], + [ + "Early childhood education", + "000466.htm" + ], + [ + "Military education and training", + "000511.htm", + [ + "Army reserve training", + "000389.htm" + ], + [ + "Defence college training", + "000451.htm" + ] + ], + [ + "Overseas skills recognition", + "000527.htm" + ], + [ + "School education", + "000561.htm", + [ + "Discipline programs", + "000465.htm" + ], + [ + "School transport regulation", + "000562.htm" + ], + [ + "Special needs programs", + "000568.htm" + ] + ], + [ + "Tertiary education", + "000581.htm" + ], + [ + "Vocational education", + "000588.htm", + [ + "Apprenticeship programs", + "000386.htm" + ], + [ + "Hospital teaching programs", + "000493.htm" + ], + [ + "Trainee programs", + "000584.htm" + ], + [ + "Workplace training", + "000595.htm" + ] + ] + ], + [ + "EMPLOYMENT", + "000016.htm", + [ + "Human resources development", + "000348.htm", + [ + "Occupational health and safety", + "000355.htm" + ], + [ + "Recruitment programs", + "000356.htm" + ], + [ + "Termination processes", + "002103.htm" + ], + [ + "Workers compensation schemes", + "000363.htm" + ], + [ + "Workplace discrimination monitoring", + "000364.htm" + ], + [ + "Workplace equity and justice programs", + "000365.htm" + ] + ], + [ + "Industrial awards and conditions", + "000349.htm", + [ + "Award conditions", + "000366.htm" + ], + [ + "Remuneration review", + "000368.htm" + ] + ], + [ + "Labour market programs", + "000347.htm", + [ + "Employment services marketing", + "000351.htm" + ], + [ + "Job placement programs", + "000352.htm" + ], + [ + "Job vacancy data management", + "000353.htm" + ] + ], + [ + "Workplace agreement processes", + "000350.htm", + [ + "Agreement bargaining processes", + "002141.htm" + ], + [ + "Agreement dispute mediation", + "000370.htm" + ], + [ + "Certified employment conditions", + "000371.htm" + ], + [ + "Employment advocacy services", + "000374.htm" + ] + ] + ], + [ + "ENVIRONMENT", + "000478.htm", + [ + "Built environment", + "000409.htm", + [ + "Building acoustics", + "000405.htm" + ], + [ + "Building preservation", + "000407.htm" + ] + ], + [ + "Climate information services", + "000203.htm" + ], + [ + "Conservation programs", + "000438.htm", + [ + "Endangered species protection", + "000475.htm" + ], + [ + "Landcare programs", + "000504.htm" + ], + [ + "Soil preservation programs", + "000567.htm" + ] + ], + [ + "Environmental impact assessment", + "000479.htm" + ], + [ + "Historic relic protection", + "000492.htm" + ], + [ + "Marine life protection programs", + "000507.htm" + ], + [ + "Natural heritage protection", + "000522.htm", + [ + "National park management", + "000520.htm" + ], + [ + "Nature reserve management", + "000523.htm" + ], + [ + "Wilderness area management", + "000593.htm" + ], + [ + "Wildlife sanctuary management", + "000594.htm" + ] + ], + [ + "Oceans governance", + "000525.htm" + ], + [ + "Pollutant prevention programs", + "000529.htm" + ], + [ + "World heritage listings", + "000596.htm" + ] + ], + [ + "FINANCE MANAGEMENT", + "000001.htm", + [ + "Commonwealth State funding", + "000017.htm" + ], + [ + "Currency", + "000018.htm", + [ + "Counterfeiting control", + "000027.htm" + ] + ], + [ + "Financial investment", + "000021.htm", + [ + "Investment scheme regulation", + "000031.htm" + ] + ], + [ + "Financial system management", + "002302.htm", + [ + "Financial system monitoring", + "002306.htm" + ], + [ + "Payments management", + "002297.htm" + ] + ], + [ + "Fiscal policy", + "000022.htm", + [ + "Public borrowing", + "000032.htm" + ], + [ + "Public debt", + "000033.htm" + ], + [ + "Public expenditure", + "000034.htm" + ] + ], + [ + "Foreign investment control", + "000030.htm" + ], + [ + "International monetary regulation", + "000023.htm" + ], + [ + "Monetary policy", + "000020.htm", + [ + "Exchange rates", + "000028.htm" + ], + [ + "Inflation", + "000029.htm" + ], + [ + "Interest rates", + "002295.htm" + ] + ], + [ + "Resource management", + "000024.htm", + [ + "Contract management", + "000037.htm" + ], + [ + "Financial administration", + "000035.htm" + ], + [ + "Financial budgeting", + "000036.htm" + ] + ], + [ + "Retirement income", + "000025.htm", + [ + "Asset assessment", + "000038.htm" + ], + [ + "Retirement saving", + "000039.htm" + ], + [ + "Superannuation regulation", + "000040.htm" + ] + ], + [ + "Statistical analysis", + "000019.htm" + ], + [ + "Taxation", + "000026.htm", + [ + "Income assessment", + "000041.htm" + ], + [ + "Revenue raising", + "000042.htm" + ], + [ + "Taxation compliance", + "000043.htm" + ] + ] + ], + [ + "GOVERNANCE", + "000002.htm", + [ + "Civic celebrations", + "000046.htm" + ], + [ + "Constitutional matters", + "000048.htm", + [ + "Constitutional conventions", + "000061.htm" + ], + [ + "Constitutional referenda", + "000062.htm" + ] + ], + [ + "Electoral matters", + "000049.htm", + [ + "Declaration of interests", + "000063.htm" + ], + [ + "Election campaigning", + "000064.htm" + ], + [ + "Electoral boundary assessment", + "000065.htm" + ] + ], + [ + "Honours and awards programs", + "000050.htm" + ], + [ + "Intergovernmental relations", + "000052.htm", + [ + "Cross-border cooperation", + "000067.htm" + ], + [ + "Intergovernment policy dissemination", + "000069.htm" + ] + ], + [ + "Legislative drafting", + "000053.htm", + [ + "Draft Bill amendment process", + "000070.htm" + ], + [ + "Legislation review", + "000071.htm" + ], + [ + "Preparation of legislative regulations", + "000072.htm" + ] + ], + [ + "Official protocol", + "000054.htm", + [ + "Ceremonial events and representation", + "000073.htm" + ], + [ + "Head of Government protocol", + "000074.htm" + ], + [ + "Official establishment management", + "000075.htm" + ], + [ + "Official hospitality", + "000076.htm" + ], + [ + "Official visits", + "000077.htm" + ] + ], + [ + "Parliamentary chamber support", + "000045.htm", + [ + "Hansard services", + "000058.htm" + ], + [ + "Parliamentary papers", + "000059.htm" + ], + [ + "Tabling of official documents", + "000060.htm" + ] + ], + [ + "Parliamentary committee and member support", + "000047.htm" + ], + [ + "Population census", + "000044.htm", + [ + "Demographic surveys", + "000055.htm" + ], + [ + "Household census", + "000056.htm" + ], + [ + "Population distribution analysis", + "000057.htm" + ] + ], + [ + "Public administration", + "002290.htm", + [ + "Government auditing", + "002291.htm" + ], + [ + "Public service", + "002292.htm" + ], + [ + "Territories administration", + "002293.htm" + ] + ], + [ + "Statistics", + "002289.htm" + ] + ], + [ + "HEALTH CARE", + "000003.htm", + [ + "Community health services", + "000078.htm", + [ + "Clinical health services", + "000087.htm" + ], + [ + "Health promotion", + "000089.htm" + ], + [ + "Primary health care", + "000090.htm" + ] + ], + [ + "Health insurance schemes", + "000079.htm" + ], + [ + "Health protocol administration", + "000080.htm", + [ + "Drugs and poisons regulation", + "000091.htm" + ], + [ + "Food hygiene regulation", + "000092.htm" + ], + [ + "Practitioner discipline", + "000093.htm" + ], + [ + "Practitioner registration", + "000095.htm" + ] + ], + [ + "Hospital services", + "000081.htm", + [ + "Hospital administration", + "000096.htm" + ], + [ + "Patient care", + "000097.htm" + ], + [ + "Pharmaceutical and drug support", + "000098.htm" + ] + ], + [ + "Medical research", + "000083.htm", + [ + "Ethical compliance", + "000099.htm" + ], + [ + "Medical aids regulation", + "000100.htm" + ], + [ + "Medical research funding", + "000101.htm" + ], + [ + "National referral laboratory services", + "000102.htm" + ], + [ + "Population-based research", + "000103.htm" + ] + ], + [ + "Public health services", + "000084.htm", + [ + "Epidemiology", + "000104.htm" + ], + [ + "Health disaster preparedness", + "000106.htm" + ], + [ + "Health hazard prevention", + "000105.htm" + ], + [ + "Medical quarantine services", + "000108.htm" + ], + [ + "Notifiable disease management", + "000109.htm" + ] + ], + [ + "Special needs services", + "000085.htm", + [ + "Dental health services", + "000111.htm" + ], + [ + "Independent living services", + "000112.htm" + ], + [ + "Mental health services", + "000113.htm" + ], + [ + "Residential services", + "000114.htm" + ] + ], + [ + "Veterans\" health services", + "000086.htm" + ] + ], + [ + "IMMIGRATION", + "000004.htm", + [ + "Citizenship", + "000115.htm", + [ + "Naturalisation assessment", + "000121.htm" + ], + [ + "Presentation arrangements", + "000122.htm" + ] + ], + [ + "Deportation", + "000116.htm" + ], + [ + "Detention programs", + "000117.htm" + ], + [ + "Migrant services", + "000118.htm", + [ + "Interpreter services", + "000123.htm" + ], + [ + "Migrant accommodation services", + "000125.htm" + ], + [ + "Migrant settlement programs", + "000126.htm" + ] + ], + [ + "Refugee services", + "000119.htm" + ], + [ + "Travel authorisation", + "000120.htm", + [ + "Permanent entry arrangements", + "000127.htm" + ], + [ + "Temporary entry arrangements", + "000128.htm" + ] + ] + ], + [ + "INDIGENOUS AFFAIRS", + "002285.htm", + [ + "Indigenous cultural heritage", + "000495.htm", + [ + "Cultural artefact repatriation", + "001772.htm" + ] + ], + [ + "Indigenous enterprise development", + "000496.htm" + ], + [ + "Indigenous health services", + "000082.htm" + ], + [ + "Indigenous heritage conservation", + "000497.htm" + ], + [ + "Indigenous reconciliation", + "000051.htm" + ], + [ + "Indigenous welfare programs", + "000498.htm" + ] + ], + [ + "INTERNATIONAL RELATIONS", + "000005.htm", + [ + "Consular services", + "000129.htm" + ], + [ + "Defence liaison", + "000132.htm", + [ + "Defence attachés", + "000140.htm" + ], + [ + "Defence cooperation programs", + "000141.htm" + ], + [ + "Defence personnel exchanges", + "000142.htm" + ], + [ + "Military advisors", + "000143.htm" + ] + ], + [ + "Diplomatic missions", + "000130.htm" + ], + [ + "International affairs", + "000131.htm", + [ + "Disarmament and arms control", + "000137.htm" + ], + [ + "Nuclear safeguards", + "000139.htm" + ] + ], + [ + "International treaties", + "000133.htm", + [ + "Treaty administration", + "001384.htm" + ] + ], + [ + "Overseas aid programs", + "000134.htm", + [ + "Development assistance programs", + "000146.htm" + ], + [ + "Overseas student scholarship programs", + "000147.htm" + ] + ], + [ + "Overseas promotion", + "000135.htm" + ], + [ + "Passport services", + "000136.htm" + ] + ], + [ + "JUSTICE ADMINISTRATION", + "000006.htm", + [ + "Administrative law", + "000149.htm", + [ + "Administrative decision appeal", + "000163.htm" + ], + [ + "Administrative decision review", + "000164.htm" + ], + [ + "Censorship standards", + "000165.htm" + ], + [ + "Copyright regulation", + "000166.htm" + ], + [ + "Recordkeeping standards", + "000167.htm" + ] + ], + [ + "Associations and corporate law", + "000150.htm", + [ + "Bankruptcy proceedings", + "000168.htm" + ], + [ + "Merger regulation", + "000169.htm" + ] + ], + [ + "Civil law", + "000151.htm", + [ + "Civil registration", + "000170.htm" + ], + [ + "Conveyancing", + "000171.htm" + ], + [ + "Dispute mediation programs", + "000174.htm" + ], + [ + "Family law proceedings", + "000172.htm" + ], + [ + "Probate applications", + "000173.htm" + ] + ], + [ + "Commissions of inquiry", + "000152.htm" + ], + [ + "Coronial law", + "000153.htm" + ], + [ + "Court reporting", + "000154.htm" + ], + [ + "Criminal law", + "000155.htm" + ], + [ + "Human rights obligations", + "000156.htm" + ], + [ + "Juvenile justice", + "000157.htm" + ], + [ + "Legal aid services", + "000158.htm" + ], + [ + "Local laws and ordinances", + "000159.htm" + ], + [ + "Native title claims", + "000160.htm", + [ + "Native title mediation programs", + "000180.htm" + ], + [ + "Native title settlement negotiations", + "000181.htm" + ] + ], + [ + "Privacy guideline monitoring", + "000161.htm" + ], + [ + "Prosecution services", + "000162.htm" + ] + ], + [ + "MARITIME SERVICES", + "000007.htm", + [ + "Cargo control", + "000198.htm" + ], + [ + "Harbour management", + "000183.htm" + ], + [ + "Marina management", + "000184.htm" + ], + [ + "Navigation", + "000185.htm", + [ + "Charting sea lanes", + "000191.htm" + ], + [ + "Light station maintenance", + "000192.htm" + ], + [ + "Navigation systems development", + "000193.htm" + ] + ], + [ + "Pilotage management", + "000182.htm" + ], + [ + "Port regulation", + "001471.htm" + ], + [ + "Sea passengers", + "001487.htm" + ], + [ + "Search and rescue", + "000187.htm", + [ + "Rescue coordination", + "000194.htm" + ], + [ + "Search technology development", + "000195.htm" + ] + ], + [ + "Ship personnel", + "000188.htm", + [ + "Personnel safety standards", + "000196.htm" + ], + [ + "Pilot licensing", + "000197.htm" + ] + ], + [ + "Ship safety", + "000189.htm", + [ + "Seaworthiness", + "000201.htm" + ], + [ + "Ship commissioning", + "000199.htm" + ], + [ + "Ship inspection", + "000200.htm" + ] + ] + ], + [ + "NATURAL RESOURCES", + "000009.htm", + [ + "Crown land administration", + "000218.htm" + ], + [ + "Energy resources", + "001451.htm", + [ + "Fossil fuel management", + "000226.htm" + ], + [ + "Renewable energy development", + "000227.htm" + ] + ], + [ + "Land use planning", + "000220.htm", + [ + "Land use zoning", + "001429.htm" + ] + ], + [ + "Land valuation", + "000222.htm" + ], + [ + "Mineral resources", + "000223.htm", + [ + "Land rehabilitation programs", + "000231.htm" + ], + [ + "Mining regulations", + "000232.htm" + ] + ], + [ + "Pollution emission control", + "000224.htm" + ], + [ + "Water resources", + "000225.htm", + [ + "Water conservation plans", + "000233.htm" + ], + [ + "Water quality monitoring", + "000234.htm" + ], + [ + "Water usage management", + "000235.htm" + ], + [ + "Waterway management", + "000236.htm" + ] + ] + ], + [ + "PRIMARY INDUSTRIES", + "000008.htm", + [ + "Chemical and pesticide regulation", + "000202.htm" + ], + [ + "Marine and rural regulation", + "000204.htm", + [ + "Agricultural industry", + "000208.htm" + ], + [ + "Fisheries industry", + "000209.htm" + ], + [ + "Food quality assurance", + "000213.htm" + ], + [ + "Forestry industry", + "000210.htm" + ] + ], + [ + "Marine and rural support", + "000205.htm", + [ + "Aquaculture industry", + "000212.htm" + ], + [ + "Horticultural industry", + "000214.htm" + ], + [ + "Pastoral industry", + "000215.htm" + ], + [ + "Silvicultural industry", + "000216.htm" + ], + [ + "Viticultural industry", + "000217.htm" + ] + ], + [ + "Quarantine", + "000211.htm" + ], + [ + "Rural field day promotion", + "000206.htm" + ], + [ + "Rural partnership programs", + "000207.htm" + ] + ], + [ + "SCIENCE", + "000010.htm", + [ + "Agricultural sciences", + "000237.htm" + ], + [ + "Animal and veterinary sciences", + "000238.htm" + ], + [ + "Applied sciences", + "000239.htm", + [ + "Engineering and technology sciences", + "000246.htm" + ], + [ + "Weights and measures standards", + "000247.htm" + ] + ], + [ + "Biological sciences", + "000240.htm", + [ + "Biochemistry", + "000248.htm" + ], + [ + "Biodiversity preservation", + "000249.htm" + ], + [ + "Biotechnology development", + "000250.htm" + ], + [ + "Botany", + "000251.htm" + ], + [ + "Entomology", + "000252.htm" + ], + [ + "Genetic engineering", + "000253.htm" + ], + [ + "Physiology", + "000254.htm" + ] + ], + [ + "Earth sciences", + "000241.htm", + [ + "Atmospheric sciences", + "000255.htm" + ], + [ + "Hydrology", + "000256.htm" + ], + [ + "Mineral exploration", + "000257.htm" + ], + [ + "Oceanography", + "000258.htm" + ], + [ + "Seismology", + "000259.htm" + ] + ], + [ + "Mathematical sciences", + "000242.htm" + ], + [ + "Medical and health sciences", + "001229.htm" + ], + [ + "Physical sciences", + "000244.htm", + [ + "Astronomical sciences", + "000260.htm" + ], + [ + "Atomic and molecular sciences", + "000261.htm" + ], + [ + "Nuclear sciences", + "000262.htm" + ] + ], + [ + "Spatial information research", + "000245.htm" + ] + ], + [ + "SECURITY", + "000011.htm", + [ + "Corrective services", + "000263.htm", + [ + "Community based corrections", + "000270.htm" + ], + [ + "Detention centre management", + "000271.htm" + ] + ], + [ + "External security", + "000264.htm", + [ + "Peacekeeping forces", + "000273.htm" + ] + ], + [ + "Information security", + "000265.htm" + ], + [ + "Intelligence", + "000266.htm", + [ + "Forensic analysis", + "000275.htm" + ], + [ + "Intelligence liaison", + "001159.htm" + ], + [ + "Intelligence support", + "000277.htm" + ] + ], + [ + "Law enforcement", + "000267.htm", + [ + "Community policing", + "000278.htm" + ], + [ + "Criminology", + "000279.htm" + ], + [ + "Police administration", + "000280.htm" + ], + [ + "Protective services", + "000281.htm" + ] + ], + [ + "National security", + "001548.htm", + [ + "Coastal surveillance", + "000269.htm" + ] + ] + ], + [ + "SPORT AND RECREATION", + "000012.htm", + [ + "Caravan and camping services", + "000284.htm" + ], + [ + "Community recreational programs", + "000285.htm", + [ + "Gambling support services", + "000290.htm" + ], + [ + "Public fitness promotion", + "000291.htm" + ], + [ + "Social club support", + "000292.htm" + ], + [ + "Volunteer support programs", + "000293.htm" + ] + ], + [ + "Gaming industry regulation", + "000286.htm" + ], + [ + "Park and reserve services", + "000289.htm" + ], + [ + "Sport and fitness development", + "000287.htm", + [ + "Athlete scholarship programs", + "000295.htm" + ], + [ + "Fundraising and donation schemes", + "000296.htm" + ], + [ + "Games administration", + "000297.htm" + ], + [ + "Games promotion", + "000298.htm" + ], + [ + "Sporting grants administration", + "000299.htm" + ] + ], + [ + "Sports drugs monitoring", + "000288.htm", + [ + "Doping detection research", + "000300.htm" + ] + ] + ], + [ + "TOURISM", + "000013.htm", + [ + "Tourism industry development", + "000301.htm" + ], + [ + "Tourist event promotion", + "000302.htm", + [ + "Advertising campaigns", + "000305.htm" + ] + ], + [ + "Travel missions", + "000303.htm" + ] + ], + [ + "TRADE", + "000014.htm", + [ + "Export regulation", + "000311.htm", + [ + "Export promotion", + "000320.htm" + ], + [ + "Prohibited export control", + "000321.htm" + ] + ], + [ + "Import regulation", + "000312.htm", + [ + "Prohibited import control", + "000323.htm" + ], + [ + "Tariff regulation", + "000322.htm" + ] + ], + [ + "Intellectual property management", + "000910.htm", + [ + "Copyright registration", + "000308.htm" + ], + [ + "Design registration", + "000310.htm" + ], + [ + "Patent registration", + "000315.htm" + ], + [ + "Trademark registration", + "000318.htm" + ] + ], + [ + "International trade agreements", + "000313.htm" + ], + [ + "Interstate trade agreements", + "000314.htm" + ], + [ + "Trade development programs", + "000316.htm" + ], + [ + "Trade expositions", + "000317.htm" + ] + ], + [ + "TRANSPORT", + "000015.htm", + [ + "Air transport", + "000324.htm", + [ + "Air transport safety", + "000332.htm" + ], + [ + "Aircraft standards", + "000330.htm" + ], + [ + "Airport services", + "000331.htm" + ] + ], + [ + "Freight movement regulation", + "000325.htm" + ], + [ + "Passenger services", + "000326.htm" + ], + [ + "Rail transport", + "000327.htm", + [ + "Rail harmonisation standards", + "000333.htm" + ], + [ + "Rail land acquisition regulation", + "000336.htm" + ], + [ + "Rail transport safety", + "000337.htm" + ], + [ + "Railway maintenance", + "000338.htm" + ], + [ + "Rolling stock regulation", + "000339.htm" + ] + ], + [ + "Road transport", + "000328.htm", + [ + "Driving licences administration", + "000340.htm" + ], + [ + "Road surface maintenance", + "000341.htm" + ], + [ + "Road traffic regulation", + "000342.htm" + ], + [ + "Road transport safety", + "000343.htm" + ], + [ + "Vehicle registration", + "000344.htm" + ], + [ + "Vehicle standards", + "000345.htm" + ] + ], + [ + "Transport infrastructure development", + "000329.htm" + ] + ] +] --- a/bubbletree.php +++ b/bubbletree.php @@ -5,13 +5,13 @@ Minimal BubbleTree Demo - - - - - - - + + + + + + + - - + + + - + + - + + + li:nth-child(2n+1)').css({clear: 'left'}); -// $('.block-grid.three-up>li:nth-child(3n+1)').css({clear: 'left'}); -// $('.block-grid.four-up>li:nth-child(4n+1)').css({clear: 'left'}); -// $('.block-grid.five-up>li:nth-child(5n+1)').css({clear: 'left'}); - - - - /* DROPDOWN NAV ------------- */ - - var currentFoundationDropdown = null; - $('.nav-bar li a, .nav-bar li a:after').each(function() { - $(this).data('clicks', 0); - }); - $('.nav-bar li a, .nav-bar li a:after').live('click', function(e) { - e.preventDefault(); - if (currentFoundationDropdown !== $(this).index() || currentFoundationDropdown === null) { - $(this).data('clicks', 0); - currentFoundationDropdown = $(this).index(); - } - $(this).data('clicks', ($(this).data('clicks') + 1)); - var f = $(this).siblings('.flyout'); - if (!f.is(':visible') && $(this).parent('.has-flyout').length > 1) { - $('.nav-bar li .flyout').hide(); - f.show(); - } else if (($(this).data('clicks') > 1) || ($(this).parent('.has-flyout').length < 1)) { - window.location = $(this).attr('href'); - } - }); - $('.nav-bar').live('click', function(e) { - e.stopPropagation(); - if ($(e.target).parents().is('.flyout') || $(e.target).is('.flyout')) { - e.preventDefault(); - } - }); - // $('body').bind('touchend', function(e) { - // if (!$(e.target).parents().is('.nav-bar') || !$(e.target).is('.nav-bar')) { - // $('.nav-bar li .flyout').is(':visible').hide(); - // } - // }); - - /* DISABLED BUTTONS ------------- */ - /* Gives elements with a class of 'disabled' a return: false; */ - -}); - --- a/javascripts/bubbletree +++ /dev/null --- a/javascripts/flotr2 +++ /dev/null --- a/javascripts/foundation.js +++ /dev/null @@ -1,14 +1,1 @@ -/* Foundation v2.1.4 http://foundation.zurb.com */ -/*! jQuery v1.7.1 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement){cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close()}d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border"){for(;g=0===c})}function S(a){return !a||!a.parentNode||a.parentNode.nodeType===11}function K(){return !0}function J(){return !1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b])){continue}if(b!=="toJSON"){return !1}}return !0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else{d=b}}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a){return this}if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2]){return f.find(a)}this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return !d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a)){return f.ready(a)}a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0){return}A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete"){return setTimeout(e.ready,1)}if(c.addEventListener){c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1)}else{if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval" in a},isNumeric:function(a){return !isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a)){return !1}try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf")){return !1}}catch(c){return !1}var d;for(d in a){}return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a){return !1}return !0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b){return null}b=e.trim(b);if(a.JSON&&a.JSON.parse){return a.JSON.parse(b)}if(n.test(b.replace(o,"@").replace(p,"]").replace(q,""))){return(new Function("return "+b))()}e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a){if(c.apply(a[f],d)===!1){break}}}else{for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k){for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e){return{}}g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent){for(o in {submit:1,change:1,focusin:1}){n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p}}k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return !!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b){return}n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function"){e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c)}g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c]){return g.events}k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k]){return}if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1){return !0}}return !1},val:function(a){var c,d,e,g=this[0];if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set" in c)||c.set(this,h,"value")===b){this.value=h}}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get" in c&&(d=c.get(g,"value"))!==b){return d}d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return !b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0){return null}c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn){return f(a)[c](d)}if(typeof a.getAttribute=="undefined"){return f.prop(a,c,d)}i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set" in h&&i&&(g=h.set(a,d,c))!==b){return g}a.setAttribute(c,""+d);return d}if(h&&"get" in h&&i&&(g=h.get(a,c))!==null){return g}g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h]){return}c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j){j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0)}return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1){return}r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode){r.push([m,s]),n=m}n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9){return[]}if(!b||typeof b!="string"){return e}var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b)){if(w.length===2&&o.relative[w[0]]){j=y(w[0]+w[1],d,f)}else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length){b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}}}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length){q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}}else{k=w=[]}}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]"){if(!u){e.push.apply(e,k)}else{if(d&&d.nodeType===1){for(t=0;k[t]!=null;t++){k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t])}}else{for(t=0;k[t]!=null;t++){k[t]&&k[t].nodeType===1&&e.push(j[t])}}}}else{s(k,e)}l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h){for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a){return[]}for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1))}return !1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else{a[2]&&m.error(a[0])}a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not"){if((a.exec(b[3])||"").length>1||/^\w/.test(b[3])){b[3]=m(b[3],null,null,c)}else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return !1}}else{if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0])){return !0}}return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return !!a.firstChild},empty:function(a){return !a.firstChild},has:function(a,b,c){return !!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f){return f(a,c,b,d)}if(e==="contains"){return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0}if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f){return f(a,c,b,d)}}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match){o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q))}var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]"){Array.prototype.push.apply(d,a)}else{if(typeof a.length=="number"){for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++){c[e].nodeType===1&&d.push(c[e])}c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1]){return s(e.getElementsByTagName(b),f)}if(h[2]&&o.find.CLASS&&e.getElementsByClassName){return s(e.getElementsByClassName(h[2]),f)}}if(e.nodeType===9){if(b==="body"&&e.body){return s([e.body],f)}if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode){return s([],f)}if(i.id===h[3]){return s([i],f)}}try{return s(e.querySelectorAll(b),f)}catch(j){}}else{if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p){return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}}catch(r){}finally{l||k.removeAttribute("id")}}}}return a(b,e,f,g)};for(var e in a){m[e]=a[e]}b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a)){try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11){return f}}}catch(g){}}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1){return}o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c){return b.getElementsByClassName(a[1])}},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return !!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return !1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a)){f+=d[0],a=a.replace(o.match.PSEUDO,"")}a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0){for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11){break}}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a){return this[0]&&this[0].parentNode?this.prevAll().length:-1}if(typeof a=="string"){return f.inArray(this[0],f(a))}return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d))){g.nodeType===1&&e.push(g),g=g[c]}return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c]){if(a.nodeType===1&&++e===b){break}}return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling){a.nodeType===1&&a!==b&&c.push(a)}return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a)){return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))})}if(typeof a!="object"&&a!==b){return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))}return f.text(this)},wrapAll:function(a){if(f.isFunction(a)){return this.each(function(b){f(this).wrapAll(a.call(this,b))})}if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1){a=a.firstChild}return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a)){return this.each(function(b){f(this).wrapInner(a.call(this,b))})}return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)})}if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)})}if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++){if(!a||f.filter(a,[d]).length){!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d)}}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild){b.removeChild(b.firstChild)}}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null}if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g){e[g]&&bk(d[g],e[g])}}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g){bj(d[g],e[g])}}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k){continue}if(typeof k=="string"){if(!_.test(k)){k=b.createTextNode(k)}else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--){o=o.lastChild}if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i){f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}}var r;if(!f.support.appendChecked){if(k[0]&&typeof(r=k.length)=="number"){for(i=0;i=0){return b+"px"}}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter){return}}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return !f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS){return bS.apply(this,arguments)}if(!this.length){return this}var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified")){f.lastModified[k]=y}if(z=v.getResponseHeader("Etag")){f.etag[k]=z}}if(a===304){w="notmodified",o=!0}else{try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}}else{u=w;if(!w||a){w="error",a<0&&(a=0)}}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n)){o[c[1].toLowerCase()]=c[2]}}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2){for(b in a){j[b]=[j[b],a[b]]}}else{b=a[v.status],v.then(b,b)}}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2){return !1}t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers){v.setRequestHeader(u,d.headers[u])}if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return !1}for(u in {success:1,error:1,complete:1}){v[u](d[u])}p=b$(bU,d,c,v);if(!p){w(-1,"No Transport")}else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2){w(-1,z)}else{throw z}}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a)){f.each(a,function(){e(this.name,this.value)})}else{for(var g in a){ca(g,a[g],c,e)}}return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState)){d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")}},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch){ch[a](0,1)}}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return !this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials" in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields){for(j in c.xhrFields){h[j]=c.xhrFields[j]}}c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e){h.setRequestHeader(j,e[j])}}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e){h.readyState!==4&&h.abort()}else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0){return this.animate(cu("show",3),a,b,c)}for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties){i.animatedProperties[b]!==!0&&(g=!1)}if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show){for(b in i.animatedProperties){f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0)}}d=i.complete,d&&(i.complete=!1,d.call(h))}return !1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return !0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using" in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0]){return null}var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static"){a=a.offsetParent}return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e){return null}g=cy(e);return g?"pageXOffset" in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e){return a==null?null:this}if(f.isFunction(a)){return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))})}if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9){return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c])}if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);(function(a){a("a[data-reveal-id]").live("click",function(c){c.preventDefault();var b=a(this).attr("data-reveal-id");a("#"+b).reveal(a(this).data())});a.fn.reveal=function(b){var c={animation:"fadeAndPop",animationSpeed:300,closeOnBackgroundClick:true,dismissModalClass:"close-reveal-modal"};var b=a.extend({},c,b);return this.each(function(){var l=a(this),g=parseInt(l.css("top")),i=l.height()+g,h=false,e=a(".reveal-modal-bg");if(e.length==0){e=a('
').insertAfter(l);e.fadeTo("fast",0.8)}function k(){e.unbind("click.modalEvent");a("."+b.dismissModalClass).unbind("click.modalEvent");if(!h){m();if(b.animation=="fadeAndPop"){l.css({top:a(document).scrollTop()-i,opacity:0,visibility:"visible"});e.fadeIn(b.animationSpeed/2);l.delay(b.animationSpeed/2).animate({top:a(document).scrollTop()+g+"px",opacity:1},b.animationSpeed,j)}if(b.animation=="fade"){l.css({opacity:0,visibility:"visible",top:a(document).scrollTop()+g});e.fadeIn(b.animationSpeed/2);l.delay(b.animationSpeed/2).animate({opacity:1},b.animationSpeed,j)}if(b.animation=="none"){l.css({visibility:"visible",top:a(document).scrollTop()+g});e.css({display:"block"});j()}}l.unbind("reveal:open",k)}l.bind("reveal:open",k);function f(){if(!h){m();if(b.animation=="fadeAndPop"){e.delay(b.animationSpeed).fadeOut(b.animationSpeed);l.animate({top:a(document).scrollTop()-i+"px",opacity:0},b.animationSpeed/2,function(){l.css({top:g,opacity:1,visibility:"hidden"});j()})}if(b.animation=="fade"){e.delay(b.animationSpeed).fadeOut(b.animationSpeed);l.animate({opacity:0},b.animationSpeed,function(){l.css({opacity:1,visibility:"hidden",top:g});j()})}if(b.animation=="none"){l.css({visibility:"hidden",top:g});e.css({display:"none"})}}l.unbind("reveal:close",f)}l.bind("reveal:close",f);l.trigger("reveal:open");var d=a("."+b.dismissModalClass).bind("click.modalEvent",function(){l.trigger("reveal:close")});if(b.closeOnBackgroundClick){e.css({cursor:"pointer"});e.bind("click.modalEvent",function(){l.trigger("reveal:close")})}a("body").keyup(function(n){if(n.which===27){l.trigger("reveal:close")}});function j(){h=false}function m(){h=true}})}})(jQuery);(function(b){var a={defaults:{animation:"horizontal-push",animationSpeed:600,timer:true,advanceSpeed:4000,pauseOnHover:false,startClockOnMouseOut:false,startClockOnMouseOutAfter:1000,directionalNav:true,captions:true,captionAnimation:"fade",captionAnimationSpeed:600,bullets:false,bulletThumbs:false,bulletThumbLocation:"",afterSlideChange:b.noop,fluid:true,centerBullets:true},activeSlide:0,numberSlides:0,orbitWidth:null,orbitHeight:null,locked:null,timerRunning:null,degrees:0,wrapperHTML:'
',timerHTML:'
',captionHTML:'
',directionalNavHTML:'
RightLeft
',bulletHTML:'
    ',init:function(f,e){var c,g=0,d=this;this.clickTimer=b.proxy(this.clickTimer,this);this.addBullet=b.proxy(this.addBullet,this);this.resetAndUnlock=b.proxy(this.resetAndUnlock,this);this.stopClock=b.proxy(this.stopClock,this);this.startTimerAfterMouseLeave=b.proxy(this.startTimerAfterMouseLeave,this);this.clearClockMouseLeaveTimer=b.proxy(this.clearClockMouseLeaveTimer,this);this.rotateTimer=b.proxy(this.rotateTimer,this);this.options=b.extend({},this.defaults,e);if(this.options.timer==="false"){this.options.timer=false}if(this.options.captions==="false"){this.options.captions=false}if(this.options.directionalNav==="false"){this.options.directionalNav=false}this.$element=b(f);this.$wrapper=this.$element.wrap(this.wrapperHTML).parent();this.$slides=this.$element.children("img, a, div");this.$element.bind("orbit.next",function(){d.shift("next")});this.$element.bind("orbit.prev",function(){d.shift("prev")});this.$element.bind("orbit.goto",function(i,h){d.shift(h)});this.$element.bind("orbit.start",function(i,h){d.startClock()});this.$element.bind("orbit.stop",function(i,h){d.stopClock()});c=this.$slides.filter("img");if(c.length===0){this.loaded()}else{c.bind("imageready",function(){g+=1;if(g===c.length){d.loaded()}})}},loaded:function(){this.$element.addClass("orbit").css({width:"1px",height:"1px"});this.setDimentionsFromLargestSlide();this.updateOptionsIfOnlyOneSlide();this.setupFirstSlide();if(this.options.timer){this.setupTimer();this.startClock()}if(this.options.captions){this.setupCaptions()}if(this.options.directionalNav){this.setupDirectionalNav()}if(this.options.bullets){this.setupBulletNav();this.setActiveBullet()}},currentSlide:function(){return this.$slides.eq(this.activeSlide)},setDimentionsFromLargestSlide:function(){var d=this,c;d.$element.add(d.$wrapper).width(this.$slides.first().width());d.$element.add(d.$wrapper).height(this.$slides.first().height());d.orbitWidth=this.$slides.first().width();d.orbitHeight=this.$slides.first().height();c=this.$slides.first().clone();this.$slides.each(function(){var e=b(this),g=e.width(),f=e.height();if(g>d.$element.width()){d.$element.add(d.$wrapper).width(g);d.orbitWidth=d.$element.width()}if(f>d.$element.height()){d.$element.add(d.$wrapper).height(f);d.orbitHeight=d.$element.height();c=b(this).clone()}d.numberSlides+=1});if(this.options.fluid){if(typeof this.options.fluid==="string"){c=b('')}d.$element.prepend(c);c.addClass("fluid-placeholder");d.$element.add(d.$wrapper).css({width:"inherit"});d.$element.add(d.$wrapper).css({height:"inherit"});b(window).bind("resize",function(){d.orbitWidth=d.$element.width();d.orbitHeight=d.$element.height()})}},lock:function(){this.locked=true},unlock:function(){this.locked=false},updateOptionsIfOnlyOneSlide:function(){if(this.$slides.length===1){this.options.directionalNav=false;this.options.timer=false;this.options.bullets=false}},setupFirstSlide:function(){var c=this;this.$slides.first().css({"z-index":3}).fadeIn(function(){c.$slides.css({display:"block"})})},startClock:function(){var c=this;if(!this.options.timer){return false}if(this.$timer.is(":hidden")){this.clock=setInterval(function(){this.$element.trigger("orbit.next")},this.options.advanceSpeed)}else{this.timerRunning=true;this.$pause.removeClass("active");this.clock=setInterval(this.rotateTimer,this.options.advanceSpeed/180)}},rotateTimer:function(){var c="rotate("+this.degrees+"deg)";this.degrees+=2;this.$rotator.css({"-webkit-transform":c,"-moz-transform":c,"-o-transform":c});if(this.degrees>180){this.$rotator.addClass("move");this.$mask.addClass("move")}if(this.degrees>360){this.$rotator.removeClass("move");this.$mask.removeClass("move");this.degrees=0;this.$element.trigger("orbit.next")}},stopClock:function(){if(!this.options.timer){return false}else{this.timerRunning=false;clearInterval(this.clock);this.$pause.addClass("active")}},setupTimer:function(){this.$timer=b(this.timerHTML);this.$wrapper.append(this.$timer);this.$rotator=this.$timer.find(".rotator");this.$mask=this.$timer.find(".mask");this.$pause=this.$timer.find(".pause");this.$timer.click(this.clickTimer);if(this.options.startClockOnMouseOut){this.$wrapper.mouseleave(this.startTimerAfterMouseLeave);this.$wrapper.mouseenter(this.clearClockMouseLeaveTimer)}if(this.options.pauseOnHover){this.$wrapper.mouseenter(this.stopClock)}},startTimerAfterMouseLeave:function(){var c=this;this.outTimer=setTimeout(function(){if(!c.timerRunning){c.startClock()}},this.options.startClockOnMouseOutAfter)},clearClockMouseLeaveTimer:function(){clearTimeout(this.outTimer)},clickTimer:function(){if(!this.timerRunning){this.startClock()}else{this.stopClock()}},setupCaptions:function(){this.$caption=b(this.captionHTML);this.$wrapper.append(this.$caption);this.setCaption()},setCaption:function(){var d=this.currentSlide().attr("data-caption"),c;if(!this.options.captions){return false}if(d){c=b(d).html();this.$caption.attr("id",d).html(c);switch(this.options.captionAnimation){case"none":this.$caption.show();break;case"fade":this.$caption.fadeIn(this.options.captionAnimationSpeed);break;case"slideOpen":this.$caption.slideDown(this.options.captionAnimationSpeed);break}}else{switch(this.options.captionAnimation){case"none":this.$caption.hide();break;case"fade":this.$caption.fadeOut(this.options.captionAnimationSpeed);break;case"slideOpen":this.$caption.slideUp(this.options.captionAnimationSpeed);break}}},setupDirectionalNav:function(){var c=this;this.$wrapper.append(this.directionalNavHTML);this.$wrapper.find(".left").click(function(){c.stopClock();c.$element.trigger("orbit.prev")});this.$wrapper.find(".right").click(function(){c.stopClock();c.$element.trigger("orbit.next")})},setupBulletNav:function(){this.$bullets=b(this.bulletHTML);this.$wrapper.append(this.$bullets);this.$slides.each(this.addBullet);this.$element.addClass("with-bullets");if(this.options.centerBullets){this.$bullets.css("margin-left",-this.$bullets.width()/2)}},addBullet:function(g,e){var d=g+1,h=b("
  • "+(d)+"
  • "),c,f=this;if(this.options.bulletThumbs){c=b(e).attr("data-thumb");if(c){h.addClass("has-thumb").css({background:"url("+this.options.bulletThumbLocation+c+") no-repeat"})}}this.$bullets.append(h);h.data("index",g);h.click(function(){f.stopClock();f.$element.trigger("orbit.goto",[h.data("index")])})},setActiveBullet:function(){if(!this.options.bullets){return false}else{this.$bullets.find("li").removeClass("active").eq(this.activeSlide).addClass("active")}},resetAndUnlock:function(){this.$slides.eq(this.prevActiveSlide).css({"z-index":1});this.unlock();this.options.afterSlideChange.call(this,this.$slides.eq(this.prevActiveSlide),this.$slides.eq(this.activeSlide))},shift:function(d){var c=d;this.prevActiveSlide=this.activeSlide;if(this.prevActiveSlide==c){return false}if(this.$slides.length=="1"){return false}if(!this.locked){this.lock();if(d=="next"){this.activeSlide++;if(this.activeSlide==this.numberSlides){this.activeSlide=0}}else{if(d=="prev"){this.activeSlide--;if(this.activeSlide<0){this.activeSlide=this.numberSlides-1}}else{this.activeSlide=d;if(this.prevActiveSlidethis.activeSlide){c="prev"}}}}this.setActiveBullet();this.$slides.eq(this.prevActiveSlide).css({"z-index":2});if(this.options.animation=="fade"){this.$slides.eq(this.activeSlide).css({opacity:0,"z-index":3}).animate({opacity:1},this.options.animationSpeed,this.resetAndUnlock)}if(this.options.animation=="horizontal-slide"){if(c=="next"){this.$slides.eq(this.activeSlide).css({left:this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock)}if(c=="prev"){this.$slides.eq(this.activeSlide).css({left:-this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock)}}if(this.options.animation=="vertical-slide"){if(c=="prev"){this.$slides.eq(this.activeSlide).css({top:this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock)}if(c=="next"){this.$slides.eq(this.activeSlide).css({top:-this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock)}}if(this.options.animation=="horizontal-push"){if(c=="next"){this.$slides.eq(this.activeSlide).css({left:this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({left:-this.orbitWidth},this.options.animationSpeed)}if(c=="prev"){this.$slides.eq(this.activeSlide).css({left:-this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({left:this.orbitWidth},this.options.animationSpeed)}}if(this.options.animation=="vertical-push"){if(c=="next"){this.$slides.eq(this.activeSlide).css({top:-this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({top:this.orbitHeight},this.options.animationSpeed)}if(c=="prev"){this.$slides.eq(this.activeSlide).css({top:this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({top:-this.orbitHeight},this.options.animationSpeed)}}this.setCaption()}}};b.fn.orbit=function(c){return this.each(function(){var d=b.extend({},a);d.init(this,c)})}})(jQuery); -/*! - * jQuery imageready Plugin - * http://www.zurb.com/playground/ - * - * Copyright 2011, ZURB - * Released under the MIT License - */ -(function(c){var b={};c.event.special.imageready={setup:function(f,e,d){b=f||b},add:function(d){var e=c(this),f;if(this.nodeType===1&&this.tagName.toLowerCase()==="img"&&this.src!==""){if(b.forceLoad){f=e.attr("src");e.attr("src","");a(this,d.handler);e.attr("src",f)}else{if(this.complete||this.readyState===4){d.handler.apply(this,arguments)}else{a(this,d.handler)}}}},teardown:function(d){c(this).unbind(".imageready")}};function a(d,f){var e=c(d);e.bind("load.imageready",function(){f.apply(d,arguments);e.unbind("load.imageready")})}}(jQuery));new function(a){a.fn.placeholder=function(b){b=b||{};var j=b.dataKey||"placeholderValue";var f=b.attr||"placeholder";var h=b.className||"placeholder";var k=b.values||[];var c=b.blockSubmit||false;var e=b.blankSubmit||false;var g=b.onSubmit||false;var i=b.value||"";var d=b.cursor_position||0;return this.filter(":input").each(function(l){a.data(this,j,k[l]||a(this).attr(f))}).each(function(){if(a.trim(a(this).val())===""){a(this).addClass(h).val(a.data(this,j))}}).focus(function(){if(a.trim(a(this).val())===a.data(this,j)){a(this).removeClass(h).val(i)}if(a.fn.setCursorPosition){a(this).setCursorPosition(d)}}).blur(function(){if(a.trim(a(this).val())===i){a(this).addClass(h).val(a.data(this,j))}}).each(function(l,m){if(c){new function(n){a(n.form).submit(function(){return a.trim(a(n).val())!=a.data(n,j)})}(m)}else{if(e){new function(n){a(n.form).submit(function(){if(a.trim(a(n).val())==a.data(n,j)){a(n).removeClass(h).val("")}return true})}(m)}else{if(g){new function(n){a(n.form).submit(g)}(m)}}}})}}(jQuery);jQuery(document).ready(function(b){function a(c){b("form.custom input:"+c).each(function(){var e=b(this).hide(),d=e.next("span.custom."+c);if(d.length===0){d=b('').insertAfter(e)}d.toggleClass("checked",e.is(":checked"))})}a("checkbox");a("radio");b("form.custom select").each(function(){var e=b(this),g=e.next("div.custom.dropdown"),c=e.find("option"),d=0,f;if(g.length===0){g=b('"');c.each(function(){f=b("
  • "+b(this).html()+"
  • ");g.find("ul").append(f)});g.prepend(''+c.first().html()+"");e.after(g);e.hide()}c.each(function(h){if(this.selected){g.find("li").eq(h).addClass("selected");g.find(".current").html(b(this).html())}});g.find("li").each(function(){g.addClass("open");if(b(this).outerWidth()>d){d=b(this).outerWidth()}g.removeClass("open")});g.css("width",d+18+"px");g.find("ul").css("width",d+16+"px")})});(function(b){function a(d){var f=d.prev(),e=f[0];e.checked=((e.checked)?false:true);d.toggleClass("checked");f.trigger("change")}function c(d){var f=d.prev(),e=f[0];b('input:radio[name="'+f.attr("name")+'"]').each(function(){b(this).next().removeClass("checked")});e.checked=((e.checked)?false:true);d.toggleClass("checked");f.trigger("change")}b(document).on("click","form.custom span.custom.checkbox",function(d){d.preventDefault();d.stopPropagation();a(b(this))});b(document).on("click","form.custom span.custom.radio",function(d){d.preventDefault();d.stopPropagation();c(b(this))});b(document).on("click","form.custom label",function(e){var d=b("#"+b(this).attr("for")),g,f;if(d.length!==0){if(d.attr("type")==="checkbox"){e.preventDefault();g=b(this).find("span.custom.checkbox");a(g)}else{if(d.attr("type")==="radio"){e.preventDefault();f=b(this).find("span.custom.radio");c(f)}}}});b(document).on("click","form.custom div.custom.dropdown a.current, form.custom div.custom.dropdown a.selector",function(d){var f=b(this),e=f.closest("div.custom.dropdown");d.preventDefault();e.toggleClass("open");if(e.hasClass("open")){b(document).bind("click.customdropdown",function(g){e.removeClass("open");b(document).unbind(".customdropdown")})}else{b(document).unbind(".customdropdown")}});b(document).on("click","form.custom div.custom.dropdown li",function(g){var h=b(this),e=h.closest("div.custom.dropdown"),f=e.prev(),d=0;g.preventDefault();g.stopPropagation();h.closest("ul").find("li").removeClass("selected");h.addClass("selected");e.removeClass("open").find("a.current").html(h.html());h.closest("ul").find("li").each(function(i){if(h[0]==this){d=i}});f[0].selectedIndex=d;f.trigger("change")})})(jQuery); -/*! http://mths.be/placeholder v1.8.5 by @mathias */ -(function(j,i,l){var k="placeholder" in i.createElement("input"),h="placeholder" in i.createElement("textarea");if(k&&h){l.fn.placeholder=function(){return this};l.fn.placeholder.input=l.fn.placeholder.textarea=true}else{l.fn.placeholder=function(){return this.filter((k?"textarea":":input")+"[placeholder]").bind("focus.placeholder",o).bind("blur.placeholder",m).trigger("blur.placeholder").end()};l.fn.placeholder.input=k;l.fn.placeholder.textarea=h;l(function(){l("form").bind("submit.placeholder",function(){var a=l(".placeholder",this).each(o);setTimeout(function(){a.each(m)},10)})});l(j).bind("unload.placeholder",function(){l(".placeholder").val("")})}function n(b){var c={},a=/^jQuery\d+$/;l.each(b.attributes,function(d,e){if(e.specified&&!a.test(e.name)){c[e.name]=e.value}});return c}function o(){var a=l(this);if(a.val()===a.attr("placeholder")&&a.hasClass("placeholder")){if(a.data("placeholder-password")){a.hide().next().show().focus().attr("id",a.removeAttr("id").data("placeholder-id"))}else{a.val("").removeClass("placeholder")}}}function m(){var a,b=l(this),e=b,c=this.id;if(b.val()===""){if(b.is(":password")){if(!b.data("placeholder-textinput")){try{a=b.clone().attr({type:"text"})}catch(d){a=l("").attr(l.extend(n(this),{type:"text"}))}a.removeAttr("name").data("placeholder-password",true).data("placeholder-id",c).bind("focus.placeholder",o);b.data("placeholder-textinput",a).data("placeholder-id",c).before(a)}b=b.removeAttr("id").hide().prev().attr("id",c).show()}b.addClass("placeholder").val(b.attr("placeholder"))}else{b.removeClass("placeholder")}}}(this,document,jQuery)); --- a/javascripts/sigma +++ /dev/null --- a/javascripts/sigma.min.js +++ /dev/null @@ -1,3552 +1,1 @@ -// Define packages: -var sigma = {}; -sigma.tools = {}; -sigma.classes = {}; -sigma.instances = {}; -// Adding Array helpers, if not present yet: -(function() { - if (!Array.prototype.some) { - Array.prototype.some = function(fun /*, thisp*/) { - var len = this.length; - if (typeof fun != 'function') { - throw new TypeError(); - } - - var thisp = arguments[1]; - for (var i = 0; i < len; i++) { - if (i in this && - fun.call(thisp, this[i], i, this)) { - return true; - } - } - - return false; - }; - } - - if (!Array.prototype.forEach) { - Array.prototype.forEach = function(fun /*, thisp*/) { - var len = this.length; - if (typeof fun != 'function') { - throw new TypeError(); - } - - var thisp = arguments[1]; - for (var i = 0; i < len; i++) { - if (i in this) { - fun.call(thisp, this[i], i, this); - } - } - }; - } - - if (!Array.prototype.map) { - Array.prototype.map = function(fun /*, thisp*/) { - var len = this.length; - if (typeof fun != 'function') { - throw new TypeError(); - } - - var res = new Array(len); - var thisp = arguments[1]; - for (var i = 0; i < len; i++) { - if (i in this) { - res[i] = fun.call(thisp, this[i], i, this); - } - } - - return res; - }; - } - - if (!Array.prototype.filter) { - Array.prototype.filter = function(fun /*, thisp*/) { - var len = this.length; - if (typeof fun != 'function') - throw new TypeError(); - - var res = new Array(); - var thisp = arguments[1]; - for (var i = 0; i < len; i++) { - if (i in this) { - var val = this[i]; // in case fun mutates this - if (fun.call(thisp, val, i, this)) { - res.push(val); - } - } - } - - return res; - }; - } - - if (!Object.keys) { - Object.keys = (function() { - var hasOwnProperty = Object.prototype.hasOwnProperty, - hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), - dontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' - ], - dontEnumsLength = dontEnums.length; - - return function(obj) { - if (typeof obj !== 'object' && - typeof obj !== 'function' || - obj === null - ) { - throw new TypeError('Object.keys called on non-object'); - } - - var result = []; - - for (var prop in obj) { - if (hasOwnProperty.call(obj, prop)) result.push(prop); - } - - if (hasDontEnumBug) { - for (var i = 0; i < dontEnumsLength; i++) { - if (hasOwnProperty.call(obj, dontEnums[i])) { - result.push(dontEnums[i]); - } - } - } - return result; - } - })(); - } -})(); - -/** - * A jQuery like properties management class. It works like jQuery .css() - * method: You can call it with juste one string to get the corresponding - * property, with a string and anything else to set the corresponding property, - * or directly with an object, and then each pair string / object (or any type) - * will be set in the properties. - * @constructor - * @this {sigma.classes.Cascade} - */ -sigma.classes.Cascade = function() { - /** - * This instance properties. - * @protected - * @type {Object} - */ - this.p = {}; - - /** - * The method to use to set/get any property of this instance. - * @param {(string|Object)} a1 If it is a string and if a2 is undefined, - * then it will return the corresponding - * property. - * If it is a string and if a2 is set, then it - * will set a2 as the property corresponding to - * a1, and return this. - * If it is an object, then each pair string / - * object (or any other type) will be set as a - * property. - * @param {*?} a2 The new property corresponding to a1 if a1 is - * a string. - * @return {(*|sigma.classes.Cascade)} Returns itself or the corresponding - * property. - */ - this.config = function(a1, a2) { - if (typeof a1 == 'string' && a2 == undefined) { - return this.p[a1]; - } else { - var o = (typeof a1 == 'object' && a2 == undefined) ? a1 : {}; - if (typeof a1 == 'string') { - o[a1] = a2; - } - - for (var k in o) { - if (this.p[k] != undefined) { - this.p[k] = o[k]; - } - } - return this; - } - }; -}; - -/** - * sigma.js custom event dispatcher class. - * @constructor - * @this {sigma.classes.EventDispatcher} - */ -sigma.classes.EventDispatcher = function() { - /** - * An object containing all the different handlers bound to one or many - * events, indexed by these events. - * @private - * @type {Object.} - */ - var _h = {}; - - /** - * Represents "this", without the well-known scope issue. - * @private - * @type {sigma.classes.EventDispatcher} - */ - var _self = this; - - /** - * Will execute the handler the next (and only the next) time that the - * indicated event (or the indicated events) will be triggered. - * @param {string} events The name of the event (or the events - * separated by spaces). - * @param {function(Object)} handler The handler to bind. - * @return {sigma.classes.EventDispatcher} Returns itself. - */ - function one(events, handler) { - if (!handler || !events) { - return _self; - } - - var eArray = ((typeof events) == 'string') ? events.split(' ') : events; - - eArray.forEach(function(event) { - if (!_h[event]) { - _h[event] = []; - } - - _h[event].push({ - 'h': handler, - 'one': true - }); - }); - - return _self; - } - - /** - * Will execute the handler everytime that the indicated event (or the - * indicated events) will be triggered. - * @param {string} events The name of the event (or the events - * separated by spaces). - * @param {function(Object)} handler The handler to bind. - * @return {sigma.classes.EventDispatcher} Returns itself. - */ - function bind(events, handler) { - if (!handler || !events) { - return _self; - } - - var eArray = ((typeof events) == 'string') ? events.split(' ') : events; - - eArray.forEach(function(event) { - if (!_h[event]) { - _h[event] = []; - } - - _h[event].push({ - 'h': handler, - 'one': false - }); - }); - - return _self; - } - - /** - * Unbinds the handler from a specified event (or specified events). - * @param {?string} events The name of the event (or the events - * separated by spaces). If undefined, - * then all handlers are unbound. - * @param {?function(Object)} handler The handler to unbind. If undefined, - * each handler bound to the event or the - * events will be unbound. - * @return {sigma.classes.EventDispatcher} Returns itself. - */ - function unbind(events, handler) { - if (!events) { - _h = {}; - } - - var eArray = typeof events == 'string' ? events.split(' ') : events; - - if (handler) { - eArray.forEach(function(event) { - if (_h[event]) { - _h[event] = _h[event].filter(function(e) { - return e['h'] != handler; - }); - } - - if (_h[event] && _h[event].length == 0) { - delete _h[event]; - } - }); - }else { - eArray.forEach(function(event) { - delete _h[event]; - }); - } - - return _self; - } - - /** - * Executes each handler bound to the event - * @param {string} type The type of the event. - * @param {?Object} content The content of the event (optional). - * @return {sigma.classes.EventDispatcher} Returns itself. - */ - function dispatch(type, content) { - if (_h[type]) { - _h[type].forEach(function(e) { - e['h']({ - 'type': type, - 'content': content, - 'target': _self - }); - }); - - _h[type] = _h[type].filter(function(e) { - return !e['one']; - }); - } - - return _self; - } - - /* PUBLIC INTERFACE: */ - this.one = one; - this.bind = bind; - this.unbind = unbind; - this.dispatch = dispatch; -}; - -(function() { -// Define local shortcut: -var id = 0; - -// Define local package: -var local = {}; -local.plugins = []; - -sigma.init = function(dom) { - var inst = new Sigma(dom, (++id).toString()); - sigma.instances[id] = new SigmaPublic(inst); - return sigma.instances[id]; -}; - -/** - * This class listen to all the different mouse events, to normalize them and - * dispatch action events instead (from "startinterpolate" to "isdragging", - * etc). - * @constructor - * @extends sigma.classes.Cascade - * @extends sigma.classes.EventDispatcher - * @param {element} dom The DOM element to bind the handlers on. - * @this {MouseCaptor} - */ -function MouseCaptor(dom) { - sigma.classes.Cascade.call(this); - sigma.classes.EventDispatcher.call(this); - - /** - * Represents "this", without the well-known scope issue. - * @private - * @type {MouseCaptor} - */ - var self = this; - - /** - * The DOM element to bind the handlers on. - * @type {element} - */ - var dom = dom; - - /** - * The different parameters that define how this instance should work. - * @see sigma.classes.Cascade - * @type {Object} - */ - this.p = { - minRatio: 1, - maxRatio: 32, - marginRatio: 1, - zoomDelta: 0.1, - dragDelta: 0.3, - zoomMultiply: 2, - directZooming: false, - blockScroll: true, - inertia: 1.1, - mouseEnabled: true - }; - - var oldMouseX = 0; - var oldMouseY = 0; - var startX = 0; - var startY = 0; - - var oldStageX = 0; - var oldStageY = 0; - var oldRatio = 1; - - var targetRatio = 1; - var targetStageX = 0; - var targetStageY = 0; - - var lastStageX = 0; - var lastStageX2 = 0; - var lastStageY = 0; - var lastStageY2 = 0; - - var progress = 0; - var isZooming = false; - - this.stageX = 0; - this.stageY = 0; - this.ratio = 1; - - this.mouseX = 0; - this.mouseY = 0; - - this.isMouseDown = false; - - /** - * Extract the local X position from a mouse event. - * @private - * @param {event} e A mouse event. - * @return {number} The local X value of the mouse. - */ - function getX(e) { - return e.offsetX != undefined && e.offsetX || - e.layerX != undefined && e.layerX || - e.clientX != undefined && e.clientX; - }; - - /** - * Extract the local Y position from a mouse event. - * @private - * @param {event} e A mouse event. - * @return {number} The local Y value of the mouse. - */ - function getY(e) { - return e.offsetY != undefined && e.offsetY || - e.layerY != undefined && e.layerY || - e.clientY != undefined && e.clientY; - }; - - /** - * Extract the wheel delta from a mouse event. - * @private - * @param {event} e A mouse event. - * @return {number} The wheel delta of the mouse. - */ - function getDelta(e) { - return e.wheelDelta != undefined && e.wheelDelta || - e.detail != undefined && -e.detail; - }; - - /** - * The handler listening to the 'move' mouse event. It will set the mouseX - * and mouseY values as the mouse position values, prevent the default event, - * and dispatch a 'move' event. - * @private - * @param {event} event A 'move' mouse event. - */ - function moveHandler(event) { - oldMouseX = self.mouseX; - oldMouseY = self.mouseY; - - self.mouseX = getX(event); - self.mouseY = getY(event); - - self.isMouseDown && drag(event); - self.dispatch('move'); - - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; - } - }; - - /** - * The handler listening to the 'up' mouse event. It will set the isMouseDown - * value as false, dispatch a 'mouseup' event, and trigger stopDrag(). - * @private - * @param {event} event A 'up' mouse event. - */ - function upHandler(event) { - if (self.p.mouseEnabled && self.isMouseDown) { - self.isMouseDown = false; - self.dispatch('mouseup'); - stopDrag(); - - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; - } - } - }; - - /** - * The handler listening to the 'down' mouse event. It will set the - * isMouseDown value as true, dispatch a 'mousedown' event, and trigger - * startDrag(). - * @private - * @param {event} event A 'down' mouse event. - */ - function downHandler(event) { - if (self.p.mouseEnabled) { - self.isMouseDown = true; - oldMouseX = self.mouseX; - oldMouseY = self.mouseY; - - self.dispatch('mousedown'); - - startDrag(); - - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; - } - } - }; - - /** - * The handler listening to the 'wheel' mouse event. It will trigger - * {@link startInterpolate} with the event delta as parameter. - * @private - * @param {event} event A 'wheel' mouse event. - */ - function wheelHandler(event) { - if (self.p.mouseEnabled) { - startInterpolate( - self.mouseX, - self.mouseY, - self.ratio * (getDelta(event) > 0 ? - self.p.zoomMultiply : - 1 / self.p.zoomMultiply) - ); - - if (self.p['blockScroll']) { - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; - } - } - } - }; - - /** - * Will start computing the scene X and Y, until {@link stopDrag} is - * triggered. - */ - function startDrag() { - oldStageX = self.stageX; - oldStageY = self.stageY; - startX = self.mouseX; - startY = self.mouseY; - - lastStageX = self.stageX; - lastStageX2 = self.stageX; - lastStageY = self.stageY; - lastStageY2 = self.stageY; - - self.dispatch('startdrag'); - }; - - /** - * Stops computing the scene position. - */ - function stopDrag() { - if (oldStageX != self.stageX || oldStageY != self.stageY) { - startInterpolate( - self.stageX + self.p.inertia * (self.stageX - lastStageX2), - self.stageY + self.p.inertia * (self.stageY - lastStageY2) - ); - } - }; - - /** - * Computes the position of the scene, relatively to the mouse position, and - * dispatches a "drag" event. - */ - function drag() { - var newStageX = self.mouseX - startX + oldStageX; - var newStageY = self.mouseY - startY + oldStageY; - - if (newStageX != self.stageX || newStageY != self.stageY) { - lastStageX2 = lastStageX; - lastStageY2 = lastStageY; - - lastStageX = newStageX; - lastStageY = newStageY; - - self.stageX = newStageX; - self.stageY = newStageY; - self.dispatch('drag'); - } - }; - - /** - * Will start computing the scene zoom ratio, until {@link stopInterpolate} is - * triggered. - * @param {number} x The new stage X. - * @param {number} y The new stage Y. - * @param {number} ratio The new zoom ratio. - */ - function startInterpolate(x, y, ratio) { - if (self.isMouseDown) { - return; - } - - window.clearInterval(self.interpolationID); - isZooming = ratio != undefined; - - oldStageX = self.stageX; - targetStageX = x; - - oldStageY = self.stageY; - targetStageY = y; - - oldRatio = self.ratio; - targetRatio = ratio || self.ratio; - targetRatio = Math.min( - Math.max(targetRatio, self.p.minRatio), - self.p.maxRatio - ); - - progress = - self.p.directZooming ? - 1 - (isZooming ? self.p.zoomDelta : self.p.dragDelta) : - 0; - - if ( - self.ratio != targetRatio || - self.stageX != targetStageX || - self.stageY != targetStageY - ) { - interpolate(); - self.interpolationID = window.setInterval(interpolate, 50); - self.dispatch('startinterpolate'); - } - }; - - /** - * Stops the move interpolation. - */ - function stopInterpolate() { - var oldRatio = self.ratio; - - if (isZooming) { - self.ratio = targetRatio; - self.stageX = targetStageX + - (self.stageX - targetStageX) * - self.ratio / - oldRatio; - self.stageY = targetStageY + - (self.stageY - targetStageY) * - self.ratio / - oldRatio; - }else { - self.stageX = targetStageX; - self.stageY = targetStageY; - } - - self.dispatch('stopinterpolate'); - }; - - /** - * Computes the interpolate ratio and the position of the scene, relatively - * to the last mouse event delta received, and dispatches a "interpolate" - * event. - */ - function interpolate() { - progress += (isZooming ? self.p.zoomDelta : self.p.dragDelta); - progress = Math.min(progress, 1); - - var k = sigma.easing.quadratic.easeout(progress); - var oldRatio = self.ratio; - - self.ratio = oldRatio * (1 - k) + targetRatio * k; - - if (isZooming) { - self.stageX = targetStageX + - (self.stageX - targetStageX) * - self.ratio / - oldRatio; - - self.stageY = targetStageY + - (self.stageY - targetStageY) * - self.ratio / - oldRatio; - } else { - self.stageX = oldStageX * (1 - k) + targetStageX * k; - self.stageY = oldStageY * (1 - k) + targetStageY * k; - } - - self.dispatch('interpolate'); - if (progress >= 1) { - window.clearInterval(self.interpolationID); - stopInterpolate(); - } - }; - - /** - * Checks that there is always a part of the graph that is displayed, to - * avoid the user to drag the graph out of the stage. - * @param {Object} b An object containing the borders of the graph. - * @param {number} width The width of the stage. - * @param {number} height The height of the stage. - * @return {MouseCaptor} Returns itself. - */ - function checkBorders(b, width, height) { - // TODO : Find the good formula - /*if (!isNaN(b.minX) && !isNaN(b.maxX)) { - self.stageX = Math.min( - self.stageX = Math.max( - self.stageX, - (b.minX - width) * self.ratio + - self.p.marginRatio*(b.maxX - b.minX) - ), - (b.maxX - width) * self.ratio + - width - - self.p.marginRatio*(b.maxX - b.minX) - ); - } - - if (!isNaN(b.minY) && !isNaN(b.maxY)) { - self.stageY = Math.min( - self.stageY = Math.max( - self.stageY, - (b.minY - height) * self.ratio + - self.p.marginRatio*(b.maxY - b.minY) - ), - (b.maxY - height) * self.ratio + - height - - self.p.marginRatio*(b.maxY - b.minY) - ); - }*/ - - return self; - }; - - // ADD CALLBACKS - dom.addEventListener('DOMMouseScroll', wheelHandler, true); - dom.addEventListener('mousewheel', wheelHandler, true); - dom.addEventListener('mousemove', moveHandler, true); - dom.addEventListener('mousedown', downHandler, true); - document.addEventListener('mouseup', upHandler, true); - - this.checkBorders = checkBorders; - this.interpolate = startInterpolate; -} - -/** - * A class to monitor some local / global probes directly on an instance, - * inside a div DOM element. - * It executes different methods (called "probes") regularly, and displays - * the results on the element. - * @constructor - * @extends sigma.classes.Cascade - * @param {Sigma} instance The instance to monitor. - * @param {element} dom The div DOM element to draw write on. - * @this {Monitor} - */ -function Monitor(instance, dom) { - sigma.classes.Cascade.call(this); - - /** - * Represents "this", without the well-known scope issue. - * @private - * @type {Monitor} - */ - var self = this; - - /** - * {@link Sigma} instance owning this Monitor instance. - * @type {Sigma} - */ - this.instance = instance; - - /** - * Determines if the monitoring is activated or not. - * @type {Boolean} - */ - this.monitoring = false; - - /** - * The different parameters that define how this instance should work. It - * also contains the different probes. - * @see sigma.classes.Cascade - * @type {Object} - */ - this.p = { - fps: 40, - dom: dom, - globalProbes: { - 'Time (ms)': sigma.chronos.getExecutionTime, - 'Queue': sigma.chronos.getQueuedTasksCount, - 'Tasks': sigma.chronos.getTasksCount, - 'FPS': sigma.chronos.getFPS - }, - localProbes: { - 'Nodes count': function() { return self.instance.graph.nodes.length; }, - 'Edges count': function() { return self.instance.graph.edges.length; } - } - }; - - /** - * Activates the monitoring: Some texts describing some values about sigma.js - * or the owning {@link Sigma} instance will appear over the graph, but - * beneath the mouse sensible DOM element. - * @return {Monitor} Returns itself. - */ - function activate() { - if (!self.monitoring) { - self.monitoring = window.setInterval(routine, 1000 / self.p.fps); - } - - return self; - } - - /** - * Desactivates the monitoring: Will disappear, and stop computing the - * different probes. - * @return {Monitor} Returns itself. - */ - function desactivate() { - if (self.monitoring) { - window.clearInterval(self.monitoring); - self.monitoring = null; - - self.p.dom.innerHTML = ''; - } - - return self; - } - - /** - * The private method dedicated to compute the different values to observe. - * @private - * @return {Monitor} Returns itself. - */ - function routine() { - var s = ''; - - s += '

    GLOBAL :

    '; - for (var k in self.p.globalProbes) { - s += '

    ' + k + ' : ' + self.p.globalProbes[k]() + '

    '; - } - - s += '

    LOCAL :

    '; - for (var k in self.p.localProbes) { - s += '

    ' + k + ' : ' + self.p.localProbes[k]() + '

    '; - } - - self.p.dom.innerHTML = s; - - return self; - } - - this.activate = activate; - this.desactivate = desactivate; -} - -/** - * Sigma is the main class. It represents the core of any instance id sigma.js. - * It is private and can be initialized only from inside sigma.js. To see its - * public interface, see {@link SigmaPublic}. - * It owns its own {@link Graph}, {@link MouseCaptor}, {@link Plotter} - * and {@link Monitor}. - * @constructor - * @extends sigma.classes.Cascade - * @extends sigma.classes.EventDispatcher - * @param {element} root The DOM root of this instance (a div, for example). - * @param {string} id The ID of this instance. - * @this {Sigma} - */ -function Sigma(root, id) { - sigma.classes.Cascade.call(this); - sigma.classes.EventDispatcher.call(this); - - /** - * Represents "this", without the well-known scope issue. - * @private - * @type {Sigma} - */ - var self = this; - - /** - * The ID of the instance. - * @type {string} - */ - this.id = id.toString(); - - /** - * The different parameters that define how this instance should work. - * @see sigma.classes.Cascade - * @type {Object} - */ - this.p = { - auto: true, - drawNodes: 2, - drawEdges: 1, - drawLabels: 2, - lastNodes: 2, - lastEdges: 0, - lastLabels: 2, - drawHoverNodes: true, - drawActiveNodes: true - }; - - /** - * The root DOM element of this instance, containing every other elements. - * @type {element} - */ - this.domRoot = root; - - /** - * The width of this instance - initially, the root's width. - * @type {number} - */ - this.width = this.domRoot.offsetWidth; - - /** - * The height of this instance - initially, the root's height. - * @type {number} - */ - this.height = this.domRoot.offsetHeight; - - /** - * The graph of this instance - initiallyempty. - * @type {Graph} - */ - this.graph = new Graph(); - - /** - * An object referencing every DOM elements used by this instance. - * @type {Object} - */ - this.domElements = {}; - - initDOM('edges', 'canvas'); - initDOM('nodes', 'canvas'); - initDOM('labels', 'canvas'); - initDOM('hover', 'canvas'); - initDOM('monitor', 'div'); - initDOM('mouse', 'canvas'); - - /** - * The class dedicated to manage the drawing process of the graph of the - * different canvas. - * @type {Plotter} - */ - this.plotter = new Plotter( - this.domElements.nodes.getContext('2d'), - this.domElements.edges.getContext('2d'), - this.domElements.labels.getContext('2d'), - this.domElements.hover.getContext('2d'), - this.graph, - this.width, - this.height - ); - - /** - * The class dedicated to monitor different probes about the running - * processes or the data, such as the number of nodes or edges, or how - * many times the graph is drawn per second. - * @type {Monitor} - */ - this.monitor = new Monitor( - this, - this.domElements.monitor - ); - - /** - * The class dedicated to manage the different mouse events. - * @type {MouseCaptor} - */ - this.mousecaptor = new MouseCaptor( - this.domElements.mouse, - this.id - ); - - // Interaction listeners: - this.mousecaptor.bind('drag interpolate', function(e) { - self.draw( - self.p.auto ? 2 : self.p.drawNodes, - self.p.auto ? 0 : self.p.drawEdges, - self.p.auto ? 2 : self.p.drawLabels, - true - ); - }).bind('stopdrag stopinterpolate', function(e) { - self.draw( - self.p.auto ? 2 : self.p.drawNodes, - self.p.auto ? 1 : self.p.drawEdges, - self.p.auto ? 2 : self.p.drawLabels, - true - ); - }).bind('mousedown mouseup', function(e) { - var targeted = self.graph.nodes.filter(function(n) { - return !!n['hover']; - }).map(function(n) { - return n.id; - }); - - self.dispatch( - e['type'] == 'mousedown' ? - 'downgraph' : - 'upgraph' - ); - - if (targeted.length) { - self.dispatch( - e['type'] == 'mousedown' ? - 'downnodes' : - 'upnodes', - targeted - ); - } - }).bind('move', function() { - self.domElements.hover.getContext('2d').clearRect( - 0, - 0, - self.domElements.hover.width, - self.domElements.hover.height - ); - - drawHover(); - drawActive(); - }); - - sigma.chronos.bind('startgenerators', function() { - if (sigma.chronos.getGeneratorsIDs().some(function(id) { - return !!id.match(new RegExp('_ext_' + self.id + '$', '')); - })) { - self.draw( - self.p.auto ? 2 : self.p.drawNodes, - self.p.auto ? 0 : self.p.drawEdges, - self.p.auto ? 2 : self.p.drawLabels - ); - } - }).bind('stopgenerators', function() { - self.draw(); - }); - - /** - * Resizes the element, and redraws the graph with the last settings. - * @param {?number} w The new width (if undefined, it will use the root - * width). - * @param {?number} h The new height (if undefined, it will use the root - * height). - * @return {Sigma} Returns itself. - */ - function resize(w, h) { - var oldW = self.width, oldH = self.height; - - if (w != undefined && h != undefined) { - self.width = w; - self.height = h; - }else { - self.width = self.domRoot.offsetWidth; - self.height = self.domRoot.offsetHeight; - } - - if (oldW != self.width || oldH != self.height) { - for (var k in self.domElements) { - self.domElements[k].setAttribute('width', self.width + 'px'); - self.domElements[k].setAttribute('height', self.height + 'px'); - } - - self.plotter.resize(self.width, self.height); - - self.draw( - self.p.lastNodes, - self.p.lastEdges, - self.p.lastLabels, - true - ); - } - return self; - }; - - /** - * Kills every drawing task currently running. Basically, it stops this - * instance's drawing process. - * @return {Sigma} Returns itself. - */ - function clearSchedule() { - sigma.chronos.removeTask( - 'node_' + self.id, 2 - ).removeTask( - 'edge_' + self.id, 2 - ).removeTask( - 'label_' + self.id, 2 - ).stopTasks(); - return self; - }; - - /** - * Initialize a DOM element, that will be stores by this instance, to make - * automatic these elements resizing. - * @private - * @param {string} id The element's ID. - * @param {string} type The element's nodeName (Example : canvas, div, ...). - * @return {Sigma} Returns itself. - */ - function initDOM(id, type) { - self.domElements[id] = document.createElement(type); - self.domElements[id].style.position = 'absolute'; - self.domElements[id].setAttribute('id', 'sigma_' + id + '_' + self.id); - self.domElements[id].setAttribute('class', 'sigma_' + id + '_' + type); - self.domElements[id].setAttribute('width', self.width + 'px'); - self.domElements[id].setAttribute('height', self.height + 'px'); - - self.domRoot.appendChild(self.domElements[id]); - return self; - }; - - /** - * Starts the graph drawing process. The three first parameters indicate - * how the different layers have to be drawn: - * . -1: The layer is not drawn, but it is not erased. - * . 0: The layer is not drawn. - * . 1: The layer is drawn progressively. - * . 2: The layer is drawn directly. - * @param {?number} nodes Determines if and how the nodes must be drawn. - * @param {?number} edges Determines if and how the edges must be drawn. - * @param {?number} labels Determines if and how the labels must be drawn. - * @param {?boolean} safe If true, nothing will happen if any generator - * affiliated to this instance is currently running - * (an iterative layout, for example). - * @return {Sigma} Returns itself. - */ - function draw(nodes, edges, labels, safe) { - if (safe && sigma.chronos.getGeneratorsIDs().some(function(id) { - return !!id.match(new RegExp('_ext_' + self.id + '$', '')); - })) { - return self; - } - - var n = (nodes == undefined) ? self.p.drawNodes : nodes; - var e = (edges == undefined) ? self.p.drawEdges : edges; - var l = (labels == undefined) ? self.p.drawLabels : labels; - - var params = { - nodes: n, - edges: e, - labels: l - }; - - self.p.lastNodes = n; - self.p.lastEdges = e; - self.p.lastLabels = l; - - // Remove tasks: - clearSchedule(); - - // Rescale graph: - self.graph.rescale( - self.width, - self.height, - n > 0, - e > 0 - ).setBorders(); - - self.mousecaptor.checkBorders( - self.graph.borders, - self.width, - self.height - ); - - self.graph.translate( - self.mousecaptor.stageX, - self.mousecaptor.stageY, - self.mousecaptor.ratio, - n > 0, - e > 0 - ); - - self.dispatch( - 'graphscaled' - ); - - // Clear scene: - for (var k in self.domElements) { - if ( - self.domElements[k].nodeName.toLowerCase() == 'canvas' && - (params[k] == undefined || params[k] >= 0) - ) { - self.domElements[k].getContext('2d').clearRect( - 0, - 0, - self.domElements[k].width, - self.domElements[k].height - ); - } - } - - self.plotter.currentEdgeIndex = 0; - self.plotter.currentNodeIndex = 0; - self.plotter.currentLabelIndex = 0; - - var previous = null; - var start = false; - - if (n) { - if (n > 1) { - while (self.plotter.task_drawNode()) {} - }else { - sigma.chronos.addTask( - self.plotter.task_drawNode, - 'node_' + self.id, - false - ); - - start = true; - previous = 'node_' + self.id; - } - } - - if (l) { - if (l > 1) { - while (self.plotter.task_drawLabel()) {} - } else { - if (previous) { - sigma.chronos.queueTask( - self.plotter.task_drawLabel, - 'label_' + self.id, - previous - ); - } else { - sigma.chronos.addTask( - self.plotter.task_drawLabel, - 'label_' + self.id, - false - ); - } - - start = true; - previous = 'label_' + self.id; - } - } - - if (e) { - if (e > 1) { - while (self.plotter.task_drawEdge()) {} - }else { - if (previous) { - sigma.chronos.queueTask( - self.plotter.task_drawEdge, - 'edge_' + self.id, - previous - ); - }else { - sigma.chronos.addTask( - self.plotter.task_drawEdge, - 'edge_' + self.id, - false - ); - } - - start = true; - previous = 'edge_' + self.id; - } - } - - self.dispatch( - 'draw' - ); - - self.refresh(); - - start && sigma.chronos.runTasks(); - return self; - }; - - /** - * Draws the hover and active nodes labels. - * @return {Sigma} Returns itself. - */ - function refresh() { - self.domElements.hover.getContext('2d').clearRect( - 0, - 0, - self.domElements.hover.width, - self.domElements.hover.height - ); - - drawHover(); - drawActive(); - - return self; - } - - /** - * Draws the hover nodes labels. This method is applied directly, and does - * not use the pseudo-asynchronous tasks process. - * @return {Sigma} Returns itself. - */ - function drawHover() { - if (self.p.drawHoverNodes) { - self.graph.checkHover( - self.mousecaptor.mouseX, - self.mousecaptor.mouseY - ); - - self.graph.nodes.forEach(function(node) { - if (node.hover && !node.active) { - self.plotter.drawHoverNode(node); - } - }); - } - - return self; - } - - /** - * Draws the active nodes labels. This method is applied directly, and does - * not use the pseudo-asynchronous tasks process. - * @return {Sigma} Returns itself. - */ - function drawActive() { - if (self.p.drawActiveNodes) { - self.graph.nodes.forEach(function(node) { - if (node.active) { - self.plotter.drawActiveNode(node); - } - }); - } - - return self; - } - - // Apply plugins: - for (var i = 0; i < local.plugins.length; i++) { - local.plugins[i](this); - } - - this.draw = draw; - this.resize = resize; - this.refresh = refresh; - this.drawHover = drawHover; - this.drawActive = drawActive; - this.clearSchedule = clearSchedule; - - window.addEventListener('resize', function() { - self.resize(); - }); -} - -/** - * This class draws the graph on the different canvas DOM elements. It just - * contains all the different methods to draw the graph, synchronously or - * pseudo-asynchronously. - * @constructor - * @param {CanvasRenderingContext2D} nodesCtx Context dedicated to draw nodes. - * @param {CanvasRenderingContext2D} edgesCtx Context dedicated to draw edges. - * @param {CanvasRenderingContext2D} labelsCtx Context dedicated to draw - * labels. - * @param {CanvasRenderingContext2D} hoverCtx Context dedicated to draw hover - * nodes labels. - * @param {Graph} graph A reference to the graph to - * draw. - * @param {number} w The width of the DOM root - * element. - * @param {number} h The width of the DOM root - * element. - * @extends sigma.classes.Cascade - * @this {Plotter} - */ -function Plotter(nodesCtx, edgesCtx, labelsCtx, hoverCtx, graph, w, h) { - sigma.classes.Cascade.call(this); - - /** - * Represents "this", without the well-known scope issue. - * @private - * @type {Plotter} - */ - var self = this; - - /** - * The different parameters that define how this instance should work. - * @see sigma.classes.Cascade - * @type {Object} - */ - this.p = { - // ------- - // LABELS: - // ------- - // Label color: - // - 'node' - // - default (then defaultLabelColor - // will be used instead) - labelColor: 'default', - defaultLabelColor: '#000', - // Label hover background color: - // - 'node' - // - default (then defaultHoverLabelBGColor - // will be used instead) - labelHoverBGColor: 'default', - defaultHoverLabelBGColor: '#fff', - // Label hover shadow: - labelHoverShadow: true, - labelHoverShadowColor: '#000', - // Label hover color: - // - 'node' - // - default (then defaultLabelHoverColor - // will be used instead) - labelHoverColor: 'default', - defaultLabelHoverColor: '#000', - // Label active background color: - // - 'node' - // - default (then defaultActiveLabelBGColor - // will be used instead) - labelActiveBGColor: 'default', - defaultActiveLabelBGColor: '#fff', - // Label active shadow: - labelActiveShadow: true, - labelActiveShadowColor: '#000', - // Label active color: - // - 'node' - // - default (then defaultLabelActiveColor - // will be used instead) - labelActiveColor: 'default', - defaultLabelActiveColor: '#000', - // Label size: - // - 'fixed' - // - 'proportional' - // Label size: - // - 'fixed' - // - 'proportional' - labelSize: 'fixed', - defaultLabelSize: 12, // for fixed display only - labelSizeRatio: 2, // for proportional display only - labelThreshold: 6, - font: 'Arial', - hoverFont: '', - activeFont: '', - fontStyle: '', - hoverFontStyle: '', - activeFontStyle: '', - // ------ - // EDGES: - // ------ - // Edge color: - // - 'source' - // - 'target' - // - default (then defaultEdgeColor or edge['color'] - // will be used instead) - edgeColor: 'source', - defaultEdgeColor: '#aaa', - defaultEdgeType: 'line', - // ------ - // NODES: - // ------ - defaultNodeColor: '#aaa', - // HOVER: - // Node hover color: - // - 'node' - // - default (then defaultNodeHoverColor - // will be used instead) - nodeHoverColor: 'node', - defaultNodeHoverColor: '#fff', - // ACTIVE: - // Node active color: - // - 'node' - // - default (then defaultNodeActiveColor - // will be used instead) - nodeActiveColor: 'node', - defaultNodeActiveColor: '#fff', - // Node border color: - // - 'node' - // - default (then defaultNodeBorderColor - // will be used instead) - borderSize: 0, - nodeBorderColor: 'node', - defaultNodeBorderColor: '#fff', - // -------- - // PROCESS: - // -------- - edgesSpeed: 200, - nodesSpeed: 200, - labelsSpeed: 200 - }; - - /** - * The canvas context dedicated to draw the nodes. - * @type {CanvasRenderingContext2D} - */ - var nodesCtx = nodesCtx; - - /** - * The canvas context dedicated to draw the edges. - * @type {CanvasRenderingContext2D} - */ - var edgesCtx = edgesCtx; - - /** - * The canvas context dedicated to draw the labels. - * @type {CanvasRenderingContext2D} - */ - var labelsCtx = labelsCtx; - - /** - * The canvas context dedicated to draw the hover nodes. - * @type {CanvasRenderingContext2D} - */ - var hoverCtx = hoverCtx; - - /** - * A reference to the graph to draw. - * @type {Graph} - */ - var graph = graph; - - /** - * The width of the stage to draw on. - * @type {number} - */ - var width = w; - - /** - * The height of the stage to draw on. - * @type {number} - */ - var height = h; - - /** - * The index of the next edge to draw. - * @type {number} - */ - this.currentEdgeIndex = 0; - - /** - * The index of the next node to draw. - * @type {number} - */ - this.currentNodeIndex = 0; - - /** - * The index of the next label to draw. - * @type {number} - */ - this.currentLabelIndex = 0; - - /** - * An atomic function to drawn the N next edges, with N as edgesSpeed. - * The counter is {@link this.currentEdgeIndex}. - * This function has been designed to work with {@link sigma.chronos}, that - * will insert frames at the middle of the calls, to make the edges drawing - * process fluid for the user. - * @see sigma.chronos - * @return {boolean} Returns true if all the edges are drawn and false else. - */ - function task_drawEdge() { - var c = graph.edges.length; - var s, t, i = 0; - - while (i++< self.p.edgesSpeed && self.currentEdgeIndex < c) { - e = graph.edges[self.currentEdgeIndex]; - s = e['source']; - t = e['target']; - if (e['hidden'] || - s['hidden'] || - t['hidden'] || - (!self.isOnScreen(s) && !self.isOnScreen(t))) { - self.currentEdgeIndex++; - }else { - drawEdge(graph.edges[self.currentEdgeIndex++]); - } - } - - return self.currentEdgeIndex < c; - }; - - /** - * An atomic function to drawn the N next nodes, with N as nodesSpeed. - * The counter is {@link this.currentEdgeIndex}. - * This function has been designed to work with {@link sigma.chronos}, that - * will insert frames at the middle of the calls, to make the nodes drawing - * process fluid for the user. - * @see sigma.chronos - * @return {boolean} Returns true if all the nodes are drawn and false else. - */ - function task_drawNode() { - var c = graph.nodes.length; - var i = 0; - - while (i++< self.p.nodesSpeed && self.currentNodeIndex < c) { - if (!self.isOnScreen(graph.nodes[self.currentNodeIndex])) { - self.currentNodeIndex++; - }else { - drawNode(graph.nodes[self.currentNodeIndex++]); - } - } - - return self.currentNodeIndex < c; - }; - - /** - * An atomic function to drawn the N next labels, with N as labelsSpeed. - * The counter is {@link this.currentEdgeIndex}. - * This function has been designed to work with {@link sigma.chronos}, that - * will insert frames at the middle of the calls, to make the labels drawing - * process fluid for the user. - * @see sigma.chronos - * @return {boolean} Returns true if all the labels are drawn and false else. - */ - function task_drawLabel() { - var c = graph.nodes.length; - var i = 0; - - while (i++< self.p.labelsSpeed && self.currentLabelIndex < c) { - if (!self.isOnScreen(graph.nodes[self.currentLabelIndex])) { - self.currentLabelIndex++; - }else { - drawLabel(graph.nodes[self.currentLabelIndex++]); - } - } - - return self.currentLabelIndex < c; - }; - - /** - * Draws one node to the corresponding canvas. - * @param {Object} node The node to draw. - * @return {Plotter} Returns itself. - */ - function drawNode(node) { - var size = Math.round(node['displaySize'] * 10) / 10; - var ctx = nodesCtx; - - ctx.fillStyle = node['color']; - ctx.beginPath(); - ctx.arc(node['displayX'], - node['displayY'], - size, - 0, - Math.PI * 2, - true); - - ctx.closePath(); - ctx.fill(); - - node['hover'] && drawHoverNode(node); - return self; - }; - - /** - * Draws one edge to the corresponding canvas. - * @param {Object} edge The edge to draw. - * @return {Plotter} Returns itself. - */ - function drawEdge(edge) { - var x1 = edge['source']['displayX']; - var y1 = edge['source']['displayY']; - var x2 = edge['target']['displayX']; - var y2 = edge['target']['displayY']; - var color = edge['color']; - - if (!color) { - switch (self.p.edgeColor) { - case 'source': - color = edge['source']['color'] || - self.p.defaultNodeColor; - break; - case 'target': - color = edge['target']['color'] || - self.p.defaultNodeColor; - break; - default: - color = self.p.defaultEdgeColor; - break; - } - } - - var ctx = edgesCtx; - - switch (edge['type'] || self.p.defaultEdgeType) { - case 'curve': - ctx.strokeStyle = color; - ctx.lineWidth = edge['displaySize'] / 3; - ctx.beginPath(); - ctx.moveTo(x1, y1); - ctx.quadraticCurveTo((x1 + x2) / 2 + (y2 - y1) / 4, - (y1 + y2) / 2 + (x1 - x2) / 4, - x2, - y2); - ctx.stroke(); - break; - case 'line': - default: - ctx.strokeStyle = color; - ctx.lineWidth = edge['displaySize'] / 3; - ctx.beginPath(); - ctx.moveTo(x1, y1); - ctx.lineTo(x2, y2); - - ctx.stroke(); - break; - } - - return self; - }; - - /** - * Draws one label to the corresponding canvas. - * @param {Object} node The label to draw. - * @return {Plotter} Returns itself. - */ - function drawLabel(node) { - var ctx = labelsCtx; - - if (node['displaySize'] >= self.p.labelThreshold || node['forceLabel']) { - var fontSize = self.p.labelSize == 'fixed' ? - self.p.defaultLabelSize : - self.p.labelSizeRatio * node['displaySize']; - - ctx.font = self.p.fontStyle + fontSize + 'px ' + self.p.font; - - ctx.fillStyle = self.p.labelColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultLabelColor; - ctx.fillText( - node['label'], - Math.round(node['displayX'] + node['displaySize'] * 1.5), - Math.round(node['displayY'] + fontSize / 2 - 3) - ); - } - - return self; - }; - - /** - * Draws one hover node to the corresponding canvas. - * @param {Object} node The hover node to draw. - * @return {Plotter} Returns itself. - */ - function drawHoverNode(node) { - var ctx = hoverCtx; - - var fontSize = self.p.labelSize == 'fixed' ? - self.p.defaultLabelSize : - self.p.labelSizeRatio * node['displaySize']; - - ctx.font = (self.p.hoverFontStyle || self.p.fontStyle || '') + ' ' + - fontSize + 'px ' + - (self.p.hoverFont || self.p.font || ''); - - ctx.fillStyle = self.p.labelHoverBGColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultHoverLabelBGColor; - - // Label background: - ctx.beginPath(); - - if (self.p.labelHoverShadow) { - ctx.shadowOffsetX = 0; - ctx.shadowOffsetY = 0; - ctx.shadowBlur = 4; - ctx.shadowColor = self.p.labelHoverShadowColor; - } - - sigma.tools.drawRoundRect( - ctx, - Math.round(node['displayX'] - fontSize / 2 - 2), - Math.round(node['displayY'] - fontSize / 2 - 2), - Math.round(ctx.measureText(node['label']).width + - node['displaySize'] * 1.5 + - fontSize / 2 + 4), - Math.round(fontSize + 4), - Math.round(fontSize / 2 + 2), - 'left' - ); - ctx.closePath(); - ctx.fill(); - - ctx.shadowOffsetX = 0; - ctx.shadowOffsetY = 0; - ctx.shadowBlur = 0; - - // Node border: - ctx.beginPath(); - ctx.fillStyle = self.p.nodeBorderColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultNodeBorderColor; - ctx.arc(Math.round(node['displayX']), - Math.round(node['displayY']), - node['displaySize'] + self.p.borderSize, - 0, - Math.PI * 2, - true); - ctx.closePath(); - ctx.fill(); - - // Node: - ctx.beginPath(); - ctx.fillStyle = self.p.nodeHoverColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultNodeHoverColor; - ctx.arc(Math.round(node['displayX']), - Math.round(node['displayY']), - node['displaySize'], - 0, - Math.PI * 2, - true); - - ctx.closePath(); - ctx.fill(); - - // Label: - ctx.fillStyle = self.p.labelHoverColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultLabelHoverColor; - ctx.fillText( - node['label'], - Math.round(node['displayX'] + node['displaySize'] * 1.5), - Math.round(node['displayY'] + fontSize / 2 - 3) - ); - - return self; - }; - - /** - * Draws one active node to the corresponding canvas. - * @param {Object} node The active node to draw. - * @return {Plotter} Returns itself. - */ - function drawActiveNode(node) { - var ctx = hoverCtx; - - if (!isOnScreen(node)) { - return self; - } - - var fontSize = self.p.labelSize == 'fixed' ? - self.p.defaultLabelSize : - self.p.labelSizeRatio * node['displaySize']; - - ctx.font = (self.p.activeFontStyle || self.p.fontStyle || '') + ' ' + - fontSize + 'px ' + - (self.p.activeFont || self.p.font || ''); - - ctx.fillStyle = self.p.labelHoverBGColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultActiveLabelBGColor; - - // Label background: - ctx.beginPath(); - - if (self.p.labelActiveShadow) { - ctx.shadowOffsetX = 0; - ctx.shadowOffsetY = 0; - ctx.shadowBlur = 4; - ctx.shadowColor = self.p.labelActiveShadowColor; - } - - sigma.tools.drawRoundRect( - ctx, - Math.round(node['displayX'] - fontSize / 2 - 2), - Math.round(node['displayY'] - fontSize / 2 - 2), - Math.round(ctx.measureText(node['label']).width + - node['displaySize'] * 1.5 + - fontSize / 2 + 4), - Math.round(fontSize + 4), - Math.round(fontSize / 2 + 2), - 'left' - ); - ctx.closePath(); - ctx.fill(); - - ctx.shadowOffsetX = 0; - ctx.shadowOffsetY = 0; - ctx.shadowBlur = 0; - - // Node border: - ctx.beginPath(); - ctx.fillStyle = self.p.nodeBorderColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultNodeBorderColor; - ctx.arc(Math.round(node['displayX']), - Math.round(node['displayY']), - node['displaySize'] + self.p.borderSize, - 0, - Math.PI * 2, - true); - ctx.closePath(); - ctx.fill(); - - // Node: - ctx.beginPath(); - ctx.fillStyle = self.p.nodeActiveColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultNodeActiveColor; - ctx.arc(Math.round(node['displayX']), - Math.round(node['displayY']), - node['displaySize'], - 0, - Math.PI * 2, - true); - - ctx.closePath(); - ctx.fill(); - - // Label: - ctx.fillStyle = self.p.labelActiveColor == 'node' ? - (node['color'] || self.p.defaultNodeColor) : - self.p.defaultLabelActiveColor; - ctx.fillText( - node['label'], - Math.round(node['displayX'] + node['displaySize'] * 1.5), - Math.round(node['displayY'] + fontSize / 2 - 3) - ); - - return self; - }; - - /** - * Determines if a node is on the screen or not. The limits here are - * bigger than the actual screen, to avoid seeing labels disappear during - * the graph manipulation. - * @param {Object} node The node to check if it is on or out the screen. - * @return {boolean} Returns false if the node is hidden or not on the screen - * or true else. - */ - function isOnScreen(node) { - if (isNaN(node['x']) || isNaN(node['y'])) { - throw (new Error('A node\'s coordinate is not a ' + - 'number (id: ' + node['id'] + ')') - ); - } - - return !node['hidden'] && - (node['displayX'] + node['displaySize'] > -width / 3) && - (node['displayX'] - node['displaySize'] < width * 4 / 3) && - (node['displayY'] + node['displaySize'] > -height / 3) && - (node['displayY'] - node['displaySize'] < height * 4 / 3); - }; - - /** - * Resizes this instance. - * @param {number} w The new width. - * @param {number} h The new height. - * @return {Plotter} Returns itself. - */ - function resize(w, h) { - width = w; - height = h; - - return self; - } - - this.task_drawLabel = task_drawLabel; - this.task_drawEdge = task_drawEdge; - this.task_drawNode = task_drawNode; - this.drawActiveNode = drawActiveNode; - this.drawHoverNode = drawHoverNode; - this.isOnScreen = isOnScreen; - this.resize = resize; -} - -function SigmaPublic(sigmaInstance) { - var s = sigmaInstance; - var self = this; - sigma.classes.EventDispatcher.call(this); - - this._core = sigmaInstance; - - this.kill = function() { - // TODO - }; - - this.getID = function() { - return s.id; - }; - - // Config: - this.configProperties = function(a1, a2) { - var res = s.config(a1, a2); - return res == s ? self : res; - }; - - this.drawingProperties = function(a1, a2) { - var res = s.plotter.config(a1, a2); - return res == s.plotter ? self : res; - }; - - this.mouseProperties = function(a1, a2) { - var res = s.mousecaptor.config(a1, a2); - return res == s.mousecaptor ? self : res; - }; - - this.graphProperties = function(a1, a2) { - var res = s.graph.config(a1, a2); - return res == s.graph ? self : res; - }; - - this.getMouse = function() { - return { - mouseX: s.mousecaptor.mouseX, - mouseY: s.mousecaptor.mouseY, - down: s.mousecaptor.isMouseDown - }; - }; - - // Actions: - this.position = function(stageX, stageY, ratio) { - if (arguments.length == 0) { - return { - stageX: s.mousecaptor.stageX, - stageY: s.mousecaptor.stageY, - ratio: s.mousecaptor.ratio - }; - }else { - s.mousecaptor.stageX = stageX != undefined ? - stageX : - s.mousecaptor.stageX; - s.mousecaptor.stageY = stageY != undefined ? - stageY : - s.mousecaptor.stageY; - s.mousecaptor.ratio = ratio != undefined ? - ratio : - s.mousecaptor.ratio; - - return self; - } - }; - - this.goTo = function(stageX, stageY, ratio) { - s.mousecaptor.interpolate(stageX, stageY, ratio); - return self; - }; - - this.zoomTo = function(x, y, ratio) { - ratio = Math.min( - Math.max(s.mousecaptor.config('minRatio'), ratio), - s.mousecaptor.config('maxRatio') - ); - if (ratio == s.mousecaptor.ratio) { - s.mousecaptor.interpolate( - x - s.width / 2 + s.mousecaptor.stageX, - y - s.height / 2 + s.mousecaptor.stageY - ); - }else { - s.mousecaptor.interpolate( - (ratio * x - s.mousecaptor.ratio * s.width/2) / - (ratio - s.mousecaptor.ratio), - (ratio * y - s.mousecaptor.ratio * s.height/2) / - (ratio - s.mousecaptor.ratio), - ratio - ); - } - return self; - }; - - this.resize = function(w, h) { - s.resize(w, h); - return self; - }; - - this.draw = function(nodes, edges, labels, safe) { - s.draw(nodes, edges, labels, safe); - return self; - }; - - this.refresh = function() { - s.refresh(); - return self; - }; - - // Tasks methods: - this.addGenerator = function(id, task, condition) { - sigma.chronos.addGenerator(id + '_ext_' + s.id, task, condition); - return self; - }; - - this.removeGenerator = function(id) { - sigma.chronos.removeGenerator(id + '_ext_' + s.id); - return self; - }; - - // Graph methods: - this.addNode = function(id, params) { - s.graph.addNode(id, params); - return self; - }; - - this.addEdge = function(id, source, target, params) { - s.graph.addEdge(id, source, target, params); - return self; - } - - this.dropNode = function(v) { - s.graph.dropNode(v); - return self; - }; - - this.dropEdge = function(v) { - s.graph.dropEdge(v); - return self; - }; - - this.pushGraph = function(object, safe) { - object.nodes && object.nodes.forEach(function(node) { - node['id'] && (!safe || !s.graph.nodesIndex[node['id']]) && - self.addNode(node['id'], node); - }); - - var isEdgeValid; - object.edges && object.edges.forEach(function(edge) { - validID = edge['source'] && edge['target'] && edge['id']; - validID && - (!safe || !s.graph.edgesIndex[edge['id']]) && - self.addNode( - edge['id'], - edge['source'], - edge['target'], - edge - ); - }); - - return self; - }; - - this.emptyGraph = function() { - s.graph.empty(); - return self; - }; - - this.getNodesCount = function() { - return s.graph.nodes.length; - }; - - this.getEdgesCount = function() { - return s.graph.edges.length; - }; - - this.iterNodes = function(fun, ids) { - s.graph.iterNodes(fun, ids); - return self; - }; - - this.iterEdges = function(fun, ids) { - s.graph.iterEdges(fun, ids); - return self; - }; - - this.getNodes = function(ids) { - return s.graph.getNodes(ids); - }; - - this.getEdges = function(ids) { - return s.graph.getEdges(ids); - }; - - // Monitoring - this.activateMonitoring = function() { - return s.monitor.activate(); - }; - - this.desactivateMonitoring = function() { - return s.monitor.desactivate(); - }; - - // Events - s.bind('downnodes upnodes downgraph upgraph', function(e) { - self.dispatch(e.type, e.content); - }); - - s.graph.bind('overnodes outnodes', function(e) { - self.dispatch(e.type, e.content); - }); -} - -/** - * The graph data model used in sigma.js. - * @constructor - * @extends sigma.classes.Cascade - * @extends sigma.classes.EventDispatcher - * @this {Graph} - */ -function Graph() { - sigma.classes.Cascade.call(this); - sigma.classes.EventDispatcher.call(this); - - /** - * Represents "this", without the well-known scope issue. - * @private - * @type {Graph} - */ - var self = this; - - /** - * The different parameters that determine how the nodes and edges should be - * translated and rescaled. - * @type {Object} - */ - this.p = { - minNodeSize: 0, - maxNodeSize: 0, - minEdgeSize: 0, - maxEdgeSize: 0, - // Scaling mode: - // - 'inside' (default) - // - 'outside' - scalingMode: 'inside', - nodesPowRatio: 0.5, - edgesPowRatio: 0 - }; - - /** - * Contains the borders of the graph. These are useful to avoid the user to - * drag the graph out of the canvas. - * @type {Object} - */ - this.borders = {}; - - /** - * Inserts a node in the graph. - * @param {string} id The node's ID. - * @param {object} params An object containing the different parameters - * of the node. - * @return {Graph} Returns itself. - */ - function addNode(id, params) { - if (self.nodesIndex[id]) { - throw new Error('Node "' + id + '" already exists.'); - } - - params = params || {}; - var n = { - // Numbers : - 'x': 0, - 'y': 0, - 'size': 1, - 'degree': 0, - 'inDegree': 0, - 'outDegree': 0, - // Flags : - 'fixed': false, - 'active': false, - 'hidden': false, - 'forceLabel': false, - // Strings : - 'label': id.toString(), - 'id': id.toString(), - // Custom attributes : - 'attr': {} - }; - - for (var k in params) { - switch (k) { - case 'id': - break; - case 'x': - case 'y': - case 'size': - n[k] = +params[k]; - break; - case 'fixed': - case 'active': - case 'hidden': - case 'forceLabel': - n[k] = !!params[k]; - break; - case 'color': - case 'label': - n[k] = params[k]; - break; - default: - n['attr'][k] = params[k]; - } - } - - self.nodes.push(n); - self.nodesIndex[id.toString()] = n; - - return self; - }; - - /** - * Generates the clone of a node, to make it easier to be exported. - * @private - * @param {Object} node The node to clone. - * @return {Object} The clone of the node. - */ - function cloneNode(node) { - return { - 'x': node['x'], - 'y': node['y'], - 'size': node['size'], - 'degree': node['degree'], - 'inDegree': node['inDegree'], - 'outDegree': node['outDegree'], - 'displayX': node['displayX'], - 'displayY': node['displayY'], - 'displaySize': node['displaySize'], - 'label': node['label'], - 'id': node['id'], - 'color': node['color'], - 'fixed': node['fixed'], - 'active': node['active'], - 'hidden': node['hidden'], - 'forceLabel': node['forceLabel'], - 'attr': node['attr'] - }; - }; - - /** - * Checks the clone of a node, and inserts its values when possible. For - * example, it is possible to modify the size or the color of a node, but it - * is not possible to modify its display values or its id. - * @private - * @param {Object} node The original node. - * @param {Object} copy The clone. - * @return {Graph} Returns itself. - */ - function checkNode(node, copy) { - for (var k in copy) { - switch (k) { - case 'id': - case 'attr': - case 'degree': - case 'inDegree': - case 'outDegree': - case 'displayX': - case 'displayY': - case 'displaySize': - break; - case 'x': - case 'y': - case 'size': - node[k] = +copy[k]; - break; - case 'fixed': - case 'active': - case 'hidden': - case 'forceLabel': - node[k] = !!copy[k]; - break; - case 'color': - case 'label': - node[k] = (copy[k] || '').toString(); - break; - default: - node['attr'][k] = copy[k]; - } - } - - return self; - }; - - /** - * Deletes one or several nodes from the graph, and the related edges. - * @param {(string|Array.)} v A string ID, or an Array of several - * IDs. - * @return {Graph} Returns itself. - */ - function dropNode(v) { - var a = (v instanceof Array ? v : [v]) || []; - - a.forEach(function(id) { - if (self.nodesIndex[id]) { - var index = null; - self.nodes.some(function(n, i) { - if (n['id'] == id) { - index = i; - return true; - } - return false; - }); - - index != null && self.nodes.splice(index, 1); - delete self.nodesIndex[id]; - - var edgesToRemove = []; - self.edges = self.edges.filter(function(e) { - if (e['source']['id'] == id) { - delete self.edgesIndex[e['id']]; - e['target']['degree']--; - e['target']['inDegree']--; - return false; - }else if (e['target']['id'] == id) { - delete self.edgesIndex[e['id']]; - e['source']['degree']--; - e['source']['outDegree']--; - return false; - } - return true; - }); - }else { - sigma.log('Node "' + id + '" does not exist.'); - } - }); - - return self; - }; - - /** - * Inserts an edge in the graph. - * @param {string} id The edge ID. - * @param {string} source The ID of the edge source. - * @param {string} target The ID of the edge target. - * @param {object} params An object containing the different parameters - * of the edge. - * @return {Graph} Returns itself. - */ - function addEdge(id, source, target, params) { - if (self.edgesIndex[id]) { - throw new Error('Edge "' + id + '" already exists.'); - } - - if (!self.nodesIndex[source]) { - var s = 'Edge\'s source "' + source + '" does not exist yet.'; - throw new Error(s); - } - - if (!self.nodesIndex[target]) { - var s = 'Edge\'s target "' + target + '" does not exist yet.'; - throw new Error(s); - } - - params = params || {}; - var e = { - 'source': self.nodesIndex[source], - 'target': self.nodesIndex[target], - 'size': 1, - 'weight': 1, - 'displaySize': 0.5, - 'label': id.toString(), - 'id': id.toString(), - 'hidden': false, - 'attr': {} - }; - - e['source']['degree']++; - e['source']['outDegree']++; - e['target']['degree']++; - e['target']['inDegree']++; - - for (var k in params) { - switch (k) { - case 'id': - case 'source': - case 'target': - break; - case 'hidden': - e[k] = !!params[k]; - break; - case 'size': - case 'weight': - e[k] = +params[k]; - break; - case 'color': - e[k] = params[k].toString(); - break; - case 'type': - e[k] = params[k].toString(); - break; - case 'label': - e[k] = params[k]; - break; - default: - e['attr'][k] = params[k]; - } - } - - self.edges.push(e); - self.edgesIndex[id.toString()] = e; - - return self; - }; - - /** - * Generates the clone of a edge, to make it easier to be exported. - * @private - * @param {Object} edge The edge to clone. - * @return {Object} The clone of the edge. - */ - function cloneEdge(edge) { - return { - 'source': edge['source']['id'], - 'target': edge['target']['id'], - 'size': edge['size'], - 'type': edge['type'], - 'weight': edge['weight'], - 'displaySize': edge['displaySize'], - 'label': edge['label'], - 'hidden': edge['hidden'], - 'id': edge['id'], - 'attr': edge['attr'], - 'color': edge['color'] - }; - }; - - /** - * Checks the clone of an edge, and inserts its values when possible. For - * example, it is possible to modify the label or the type of an edge, but it - * is not possible to modify its display values or its id. - * @private - * @param {Object} edge The original edge. - * @param {Object} copy The clone. - * @return {Graph} Returns itself. - */ - function checkEdge(edge, copy) { - for (var k in copy) { - switch (k) { - case 'id': - case 'displaySize': - break; - case 'weight': - case 'size': - edge[k] = +copy[k]; - break; - case 'source': - case 'target': - edge[k] = self.nodesIndex[k] || edge[k]; - break; - case 'hidden': - edge[k] = !!copy[k]; - break; - case 'color': - case 'label': - case 'type': - edge[k] = (copy[k] || '').toString(); - break; - default: - edge['attr'][k] = copy[k]; - } - } - - return self; - }; - - /** - * Deletes one or several edges from the graph. - * @param {(string|Array.)} v A string ID, or an Array of several - * IDs. - * @return {Graph} Returns itself. - */ - function dropEdge(v) { - var a = (v instanceof Array ? v : [v]) || []; - - a.forEach(function(id) { - if (self.edgesIndex[id]) { - self.edgesIndex[id]['source']['degree']--; - self.edgesIndex[id]['source']['outDegree']--; - self.edgesIndex[id]['target']['degree']--; - self.edgesIndex[id]['target']['inDegree']--; - - var index = null; - self.edges.some(function(n, i) { - if (n['id'] == id) { - index = i; - return true; - } - return false; - }); - - index != null && self.edges.splice(index, 1); - delete self.edgesIndex[id]; - }else { - sigma.log('Edge "' + id + '" does not exist.'); - } - }); - - return self; - }; - - /** - * Deletes every nodes and edges from the graph. - * @return {Graph} Returns itself. - */ - function empty() { - self.nodes = []; - self.nodesIndex = {}; - self.edges = []; - self.edgesIndex = {}; - - return self; - }; - - /** - * Computes the display x, y and size of each node, relatively to the - * original values and the borders determined in the parameters, such as - * each node is in the described area. - * @param {number} w The area width (actually the width of the DOM - * root). - * @param {number} h The area height (actually the height of the - * DOM root). - * @param {boolean} parseNodes Indicates if the nodes have to be parsed. - * @param {boolean} parseEdges Indicates if the edges have to be parsed. - * @return {Graph} Returns itself. - */ - function rescale(w, h, parseNodes, parseEdges) { - var weightMax = 0, sizeMax = 0; - - parseNodes && self.nodes.forEach(function(node) { - sizeMax = Math.max(node['size'], sizeMax); - }); - - parseEdges && self.edges.forEach(function(edge) { - weightMax = Math.max(edge['size'], weightMax); - }); - - sizeMax = sizeMax || 1; - weightMax = weightMax || 1; - - // Recenter the nodes: - var xMin, xMax, yMin, yMax; - parseNodes && self.nodes.forEach(function(node) { - xMax = Math.max(node['x'], xMax || node['x']); - xMin = Math.min(node['x'], xMin || node['x']); - yMax = Math.max(node['y'], yMax || node['y']); - yMin = Math.min(node['y'], yMin || node['y']); - }); - - // First, we compute the scaling ratio, without considering the sizes - // of the nodes : Each node will have its center in the canvas, but might - // be partially out of it. - var scale = self.p.scalingMode == 'outside' ? - Math.max(w / Math.max(xMax - xMin, 1), - h / Math.max(yMax - yMin, 1)) : - Math.min(w / Math.max(xMax - xMin, 1), - h / Math.max(yMax - yMin, 1)); - - // Then, we correct that scaling ratio considering a margin, which is - // basically the size of the biggest node. - // This has to be done as a correction since to compare the size of the - // biggest node to the X and Y values, we have to first get an - // approximation of the scaling ratio. - var margin = (self.p.maxNodeSize || sizeMax) / scale; - xMax += margin; - xMin -= margin; - yMax += margin; - yMin -= margin; - - scale = self.p.scalingMode == 'outside' ? - Math.max(w / Math.max(xMax - xMin, 1), - h / Math.max(yMax - yMin, 1)) : - Math.min(w / Math.max(xMax - xMin, 1), - h / Math.max(yMax - yMin, 1)); - - // Size homothetic parameters: - var a, b; - if (!self.p.maxNodeSize && !self.p.minNodeSize) { - a = 1; - b = 0; - }else if (self.p.maxNodeSize == self.p.minNodeSize) { - a = 0; - b = self.p.maxNodeSize; - }else { - a = (self.p.maxNodeSize - self.p.minNodeSize) / sizeMax; - b = self.p.minNodeSize; - } - - var c, d; - if (!self.p.maxEdgeSize && !self.p.minEdgeSize) { - c = 1; - d = 0; - }else if (self.p.maxEdgeSize == self.p.minEdgeSize) { - c = 0; - d = self.p.minEdgeSize; - }else { - c = (self.p.maxEdgeSize - self.p.minEdgeSize) / weightMax; - d = self.p.minEdgeSize; - } - - // Rescale the nodes: - parseNodes && self.nodes.forEach(function(node) { - node['displaySize'] = node['size'] * a + b; - - if (!node['fixed']) { - node['displayX'] = (node['x'] - (xMax + xMin) / 2) * scale + w / 2; - node['displayY'] = (node['y'] - (yMax + yMin) / 2) * scale + h / 2; - } - }); - - parseEdges && self.edges.forEach(function(edge) { - edge['displaySize'] = edge['size'] * c + d; - }); - - return self; - }; - - /** - * Translates the display values of the nodes and edges relatively to the - * scene position and zoom ratio. - * @param {number} sceneX The x position of the scene. - * @param {number} sceneY The y position of the scene. - * @param {number} ratio The zoom ratio of the scene. - * @param {boolean} parseNodes Indicates if the nodes have to be parsed. - * @param {boolean} parseEdges Indicates if the edges have to be parsed. - * @return {Graph} Returns itself. - */ - function translate(sceneX, sceneY, ratio, parseNodes, parseEdges) { - var sizeRatio = Math.pow(ratio, self.p.nodesPowRatio); - parseNodes && self.nodes.forEach(function(node) { - if (!node['fixed']) { - node['displayX'] = node['displayX'] * ratio + sceneX; - node['displayY'] = node['displayY'] * ratio + sceneY; - } - - node['displaySize'] = node['displaySize'] * sizeRatio; - }); - - sizeRatio = Math.pow(ratio, self.p.edgesPowRatio); - parseEdges && self.edges.forEach(function(edge) { - edge['displaySize'] = edge['displaySize'] * sizeRatio; - }); - - return self; - }; - - /** - * Determines the borders of the graph as it will be drawn. It is used to - * avoid the user to drag the graph out of the canvas. - */ - function setBorders() { - self.borders = {}; - - self.nodes.forEach(function(node) { - self.borders.minX = Math.min( - self.borders.minX == undefined ? - node['displayX'] - node['displaySize'] : - self.borders.minX, - node['displayX'] - node['displaySize'] - ); - - self.borders.maxX = Math.max( - self.borders.maxX == undefined ? - node['displayX'] + node['displaySize'] : - self.borders.maxX, - node['displayX'] + node['displaySize'] - ); - - self.borders.minY = Math.min( - self.borders.minY == undefined ? - node['displayY'] - node['displaySize'] : - self.borders.minY, - node['displayY'] - node['displaySize'] - ); - - self.borders.maxY = Math.max( - self.borders.maxY == undefined ? - node['displayY'] - node['displaySize'] : - self.borders.maxY, - node['displayY'] - node['displaySize'] - ); - }); - } - - /** - * Checks which nodes are under the (mX, mY) points, representing the mouse - * position. - * @param {number} mX The mouse X position. - * @param {number} mY The mouse Y position. - * @return {Graph} Returns itself. - */ - function checkHover(mX, mY) { - var dX, dY, s, over = [], out = []; - self.nodes.forEach(function(node) { - if (node['hidden']) { - node['hover'] = false; - return; - } - - dX = Math.abs(node['displayX'] - mX); - dY = Math.abs(node['displayY'] - mY); - s = node['displaySize']; - - var oldH = node['hover']; - var newH = dX < s && dY < s && Math.sqrt(dX * dX + dY * dY) < s; - - if (oldH && !newH) { - node['hover'] = false; - out.push(node.id); - } else if (newH && !oldH) { - node['hover'] = true; - over.push(node.id); - } - }); - - over.length && self.dispatch('overnodes', over); - out.length && self.dispatch('outnodes', out); - - return self; - }; - - /** - * Applies a function to a clone of each node (or indicated nodes), and then - * tries to apply the modifications made on the clones to the original nodes. - * @param {function(Object)} fun The function to execute. - * @param {?Array.} ids An Array of node IDs (optional). - * @return {Graph} Returns itself. - */ - function iterNodes(fun, ids) { - var a = ids ? ids.map(function(id) { - return self.nodesIndex[id]; - }) : self.nodes; - - var aCopies = a.map(cloneNode); - aCopies.forEach(fun); - - a.forEach(function(n, i) { - checkNode(n, aCopies[i]); - }); - - return self; - }; - - /** - * Applies a function to a clone of each edge (or indicated edges), and then - * tries to apply the modifications made on the clones to the original edges. - * @param {function(Object)} fun The function to execute. - * @param {?Array.} ids An Array of edge IDs (optional). - * @return {Graph} Returns itself. - */ - function iterEdges(fun, ids) { - var a = ids ? ids.map(function(id) { - return self.edgesIndex[id]; - }) : self.edges; - - var aCopies = a.map(cloneEdge); - aCopies.forEach(fun); - - a.forEach(function(e, i) { - checkEdge(e, aCopies[i]); - }); - - return self; - }; - - /** - * Returns a specific node clone or an array of specified node clones. - * @param {(string|Array.)} ids The ID or an array of node IDs. - * @return {(Object|Array.)} The clone or the array of clones. - */ - function getNodes(ids) { - var a = ((ids instanceof Array ? ids : [ids]) || []).map(function(id) { - return cloneNode(self.nodesIndex[id]); - }); - - return (ids instanceof Array ? a : a[0]); - }; - - /** - * Returns a specific edge clone or an array of specified edge clones. - * @param {(string|Array.)} ids The ID or an array of edge IDs. - * @return {(Object|Array.)} The clone or the array of clones. - */ - function getEdges(ids) { - var a = ((ids instanceof Array ? ids : [ids]) || []).map(function(id) { - return cloneEdge(self.edgesIndex[id]); - }); - - return (ids instanceof Array ? a : a[0]); - }; - - empty(); - - this.addNode = addNode; - this.addEdge = addEdge; - this.dropNode = dropNode; - this.dropEdge = dropEdge; - - this.iterEdges = iterEdges; - this.iterNodes = iterNodes; - - this.getEdges = getEdges; - this.getNodes = getNodes; - - this.empty = empty; - this.rescale = rescale; - this.translate = translate; - this.setBorders = setBorders; - this.checkHover = checkHover; -} - -sigma.easing = { - linear: {}, - quadratic: {} -}; - -sigma.easing.linear.easenone = function(k) { - return k; -}; - -sigma.easing.quadratic.easein = function(k) { - return k * k; -}; - -sigma.easing.quadratic.easeout = function(k) { - return - k * (k - 2); -}; - -sigma.easing.quadratic.easeinout = function(k) { - if ((k *= 2) < 1) return 0.5 * k * k; - return - 0.5 * (--k * (k - 2) - 1); -}; - -sigma.debugMode = 0; - -sigma.log = function() { - if (sigma.debugMode == 1) { - for (var k in arguments) { - console.log(arguments[k]); - } - }else if (sigma.debugMode > 1) { - for (var k in arguments) { - throw new Error(arguments[k]); - } - } - - return sigma; -}; - -/** - * Add a function to the prototype of SigmaPublic, but with access to the - * Sigma class properties. - * @param {string} pluginName [description]. - * @param {function} caller [description]. - * @param {function(Sigma)} launcher [description]. - */ -sigma.addPlugin = function(pluginName, caller, launcher) { - SigmaPublic.prototype[pluginName] = caller; - local.plugins.push(launcher); -}; -sigma.tools.drawRoundRect = function(ctx, x, y, w, h, ellipse, corners) { - var e = ellipse ? ellipse : 0; - var c = corners ? corners : []; - c = ((typeof c) == 'string') ? c.split(' ') : c; - - var tl = e && (c.indexOf('topleft') >= 0 || - c.indexOf('top') >= 0 || - c.indexOf('left') >= 0); - var tr = e && (c.indexOf('topright') >= 0 || - c.indexOf('top') >= 0 || - c.indexOf('right') >= 0); - var bl = e && (c.indexOf('bottomleft') >= 0 || - c.indexOf('bottom') >= 0 || - c.indexOf('left') >= 0); - var br = e && (c.indexOf('bottomright') >= 0 || - c.indexOf('bottom') >= 0 || - c.indexOf('right') >= 0); - - ctx.moveTo(x, y + e); - - if (tl) { - ctx.arcTo(x, y, x + e, y, e); - }else { - ctx.lineTo(x, y); - } - - if (tr) { - ctx.lineTo(x + w - e, y); - ctx.arcTo(x + w, y, x + w, y + e, e); - }else { - ctx.lineTo(x + w, y); - } - - if (br) { - ctx.lineTo(x + w, y + h - e); - ctx.arcTo(x + w, y + h, x + w - e, y + h, e); - }else { - ctx.lineTo(x + w, y + h); - } - - if (bl) { - ctx.lineTo(x + e, y + h); - ctx.arcTo(x, y + h, x, y + h - e, e); - }else { - ctx.lineTo(x, y + h); - } - - ctx.lineTo(x, y + e); -}; - -sigma.tools.getRGB = function(s, asArray) { - s = s.toString(); - var res = { - 'r': 0, - 'g': 0, - 'b': 0 - }; - - if (s.length >= 3) { - if (s.charAt(0) == '#') { - var l = s.length - 1; - if (l == 6) { - res = { - 'r': parseInt(s.charAt(1) + s.charAt(2), 16), - 'g': parseInt(s.charAt(3) + s.charAt(4), 16), - 'b': parseInt(s.charAt(5) + s.charAt(5), 16) - }; - }else if (l == 3) { - res = { - 'r': parseInt(s.charAt(1) + s.charAt(1), 16), - 'g': parseInt(s.charAt(2) + s.charAt(2), 16), - 'b': parseInt(s.charAt(3) + s.charAt(3), 16) - }; - } - } - } - - if (asArray) { - res = [ - res['r'], - res['g'], - res['b'] - ]; - } - - return res; -}; - -sigma.tools.rgbToHex = function(R, G, B) { - return sigma.tools.toHex(R) + sigma.tools.toHex(G) + sigma.tools.toHex(B); -}; - -sigma.tools.toHex = function(n) { - n = parseInt(n, 10); - - if (isNaN(n)) { - return '00'; - } - n = Math.max(0, Math.min(n, 255)); - return '0123456789ABCDEF'.charAt((n - n % 16) / 16) + - '0123456789ABCDEF'.charAt(n % 16); -}; - -/** - * sigma.chronos manages frames insertion to simulate asynchronous computing. - * It has been designed to make possible to execute heavy computing tasks - * for the browser, without freezing it. - * @constructor - * @extends sigma.classes.Cascade - * @extends sigma.classes.EventDispatcher - * @this {sigma.chronos} - */ -sigma.chronos = new (function() { - sigma.classes.EventDispatcher.call(this); - - /** - * Represents "this", without the well-known scope issue. - * @private - * @type {sigma.chronos} - */ - var self = this; - - /** - * Indicates whether any task is actively running or not. - * @private - * @type {boolean} - */ - var isRunning = false; - - /** - * Indicates the FPS "goal", that will define the theoretical - * frame length. - * @private - * @type {number} - */ - var fpsReq = 80; - - /** - * Stores the last computed FPS value (FPS is computed only when any - * task is running). - * @private - * @type {number} - */ - var lastFPS = 0; - - /** - * The number of frames inserted since the last start. - * @private - * @type {number} - */ - var framesCount = 0; - - /** - * The theoretical frame time. - * @private - * @type {number} - */ - var frameTime = 1000 / fpsReq; - - /** - * The theoretical frame length, minus the last measured delay. - * @private - * @type {number} - */ - var correctedFrameTime = frameTime; - - /** - * The measured length of the last frame. - * @private - * @type {number} - */ - var effectiveTime = 0; - - /** - * The time passed since the last runTasks action. - * @private - * @type {number} - */ - var currentTime = 0; - - /** - * The time when the last frame was inserted. - * @private - * @type {number} - */ - var startTime = 0; - - /** - * The difference between the theoretical frame length and the - * last measured frame length. - * @private - * @type {number} - */ - var delay = 0; - - /** - * The container of all active generators. - * @private - * @type {Object.} - */ - var generators = {}; - - /** - * The array of all the referenced and active tasks. - * @private - * @type {Array.} - */ - var tasks = []; - - /** - * The array of all the referenced and queued tasks. - * @private - * @type {Array.} - */ - var queuedTasks = []; - - /** - * The index of the next task to execute. - * @private - * @type {number} - */ - var taskIndex = 0; - - - /** - * Inserts a frame before executing the callback. - * @param {function()} callback The callback to execute after having - * inserted the frame. - * @return {sigma.chronos} Returns itself. - */ - function insertFrame(callback) { - window.setTimeout(callback, 0); - return self; - } - - /** - * The local method that executes routine, and inserts frames when needed. - * It dispatches a "frameinserted" event after having inserted any frame, - * and an "insertframe" event before. - * @private - */ - function frameInserter() { - self.dispatch('frameinserted'); - while (isRunning && tasks.length && routine()) {} - - if (!isRunning || !tasks.length) { - stopTasks(); - } else { - startTime = (new Date()).getTime(); - framesCount++; - delay = effectiveTime - frameTime; - correctedFrameTime = frameTime - delay; - - self.dispatch('insertframe'); - insertFrame(frameInserter); - } - }; - - /** - * The local method that executes the tasks, and compares the current frame - * length to the ideal frame length. - * @private - * @return {boolean} Returns false if the current frame should be ended, - * and true else. - */ - function routine() { - taskIndex = taskIndex % tasks.length; - - if (!tasks[taskIndex].task()) { - var n = tasks[taskIndex].taskName; - - queuedTasks = queuedTasks.filter(function(e) { - (e.taskParent == n) && tasks.push({ - taskName: e.taskName, - task: e.task - }); - return e.taskParent != n; - }); - - self.dispatch('killed', tasks.splice(taskIndex--, 1)[0]); - } - - taskIndex++; - effectiveTime = (new Date()).getTime() - startTime; - return effectiveTime <= correctedFrameTime; - }; - - /** - * Starts tasks execution. - * @return {sigma.chronos} Returns itself. - */ - function runTasks() { - isRunning = true; - taskIndex = 0; - framesCount = 0; - - startTime = (new Date()).getTime(); - currentTime = startTime; - - self.dispatch('start'); - self.dispatch('insertframe'); - insertFrame(frameInserter); - return self; - }; - - /** - * Stops tasks execution, and dispatch a "stop" event. - * @return {sigma.chronos} Returns itself. - */ - function stopTasks() { - self.dispatch('stop'); - isRunning = false; - return self; - }; - - /** - * A task is a function that will be executed continuously while it returns - * true. As soon as it return false, the task will be removed. - * If several tasks are present, they will be executed in parallele. - * This method will add the task to this execution process. - * @param {function(): boolean} task The task to add. - * @param {string} name The name of the worker, used for - * managing the different tasks. - * @param {boolean} autostart If true, sigma.chronos will start - * automatically if it is not working - * yet. - * @return {sigma.chronos} Returns itself. - */ - function addTask(task, name, autostart) { - if (typeof task != 'function') { - throw new Error('Task "' + name + '" is not a function'); - } - - tasks.push({ - taskName: name, - task: task - }); - - isRunning = !!(isRunning || (autostart && runTasks()) || true); - return self; - }; - - /** - * Will add a task that will be start to be executed as soon as a task - * named as the parent will be removed. - * @param {function(): boolean} task The task to add. - * @param {string} name The name of the worker, used for - * managing the different tasks. - * @param {string} parent The name of the parent task. - * @return {sigma.chronos} Returns itself. - */ - function queueTask(task, name, parent) { - if (typeof task != 'function') { - throw new Error('Task "' + name + '" is not a function'); - } - - if (!tasks.concat(queuedTasks).some(function(e) { - return e.taskName == parent; - })) { - throw new Error( - 'Parent task "' + parent + '" of "' + name + '" is not attached.' - ); - } - - queuedTasks.push({ - taskParent: parent, - taskName: name, - task: task - }); - - return self; - }; - - /** - * Removes a task. - * @param {string} v If v is undefined, then every tasks will - * be removed. If not, each task named v will - * be removed. - * @param {number} queueStatus Determines the queued tasks behaviour. If 0, - * then nothing will happen. If 1, the tasks - * queued to any removed task will be triggered. - * If 2, the tasks queued to any removed task - * will be removed as well. - * @return {sigma.chronos} Returns itself. - */ - function removeTask(v, queueStatus) { - if (v == undefined) { - tasks = []; - if (queueStatus == 1) { - queuedTasks = []; - }else if (queueStatus == 2) { - tasks = queuedTasks; - queuedTasks = []; - } - stopTasks(); - } else { - var n = (typeof v == 'string') ? v : ''; - tasks = tasks.filter(function(e) { - if ((typeof v == 'string') ? e.taskName == v : e.task == v) { - n = e.taskName; - return false; - } - return true; - }); - - if (queueStatus > 0) { - queuedTasks = queuedTasks.filter(function(e) { - if (queueStatus == 1 && e.taskParent == n) { - tasks.push(e); - } - return e.taskParent != n; - }); - } - } - - isRunning = !!(!tasks.length || (stopTasks() && false)); - return self; - }; - - /** - * A generator is a pair task/condition. The task will be executed - * while it returns true. - * When it returns false, the condition will be tested. If - * the condition returns true, the task will be executed - * again at the next process iteration. If not, the generator - * is removed. - * If several generators are present, they will be executed one - * by one: When the first stops, the second will start, etc. When - * they are all ended, then the conditions will be tested to know - * which generators have to be started again. - * @param {string} id The generators ID. - * @param {function(): boolean} task The generator's task. - * @param {function(): boolean} condition The generator's condition. - * @return {sigma.chronos} Returns itself. - */ - function addGenerator(id, task, condition) { - if (generators[id] != undefined) { - return self; - } - - generators[id] = { - task: task, - condition: condition - }; - - getGeneratorsCount(true) == 0 && startGenerators(); - return self; - }; - - /** - * Removes a generator. It means that the task will continue being eecuted - * until it returns false, but then the - * condition will not be tested. - * @param {string} id The generator's ID. - * @return {sigma.chronos} Returns itself. - */ - function removeGenerator(id) { - if (generators[id]) { - generators[id].on = false; - generators[id].del = true; - } - return self; - }; - - /** - * Returns the number of generators. - * @private - * @param {boolean} running If true, returns the number of active - * generators instead. - * @return {sigma.chronos} Returns itself. - */ - function getGeneratorsCount(running) { - return running ? - Object.keys(generators).filter(function(id) { - return !!generators[id].on; - }).length : - Object.keys(generators).length; - }; - - /** - * Returns the array of the generators IDs. - * @return {array.} The array of IDs. - */ - function getGeneratorsIDs() { - return Object.keys(generators); - } - - /** - * startGenerators is the method that manages which generator - * is the next to start when another one stops. It will dispatch - * a "stopgenerators" event if there is no more generator to start, - * and a "startgenerators" event else. - * @return {sigma.chronos} Returns itself. - */ - function startGenerators() { - if (!Object.keys(generators).length) { - self.dispatch('stopgenerators'); - }else { - self.dispatch('startgenerators'); - - self.unbind('killed', onTaskEnded); - insertFrame(function() { - for (var k in generators) { - generators[k].on = true; - addTask( - generators[k].task, - k, - false - ); - } - }); - - self.bind('killed', onTaskEnded).runTasks(); - } - - return self; - }; - - /** - * A callback triggered everytime the task of a generator stops, that will - * test the related generator's condition, and see if there is still any - * generator to start. - * @private - * @param {Object} e The sigma.chronos "killed" event. - */ - function onTaskEnded(e) { - if (generators[e['content'].taskName] != undefined) { - if (generators[e['content'].taskName].del || - !generators[e['content'].taskName].condition()) { - delete generators[e['content'].taskName]; - }else { - generators[e['content'].taskName].on = false; - } - - if (getGeneratorsCount(true) == 0) { - startGenerators(); - } - } - }; - - /** - * Either set or returns the fpsReq property. This property determines - * the number of frames that should be inserted per second. - * @param {?number} v The frequency asked. - * @return {(Chronos|number)} Returns the frequency if v is undefined, and - * itself else. - */ - function frequency(v) { - if (v != undefined) { - fpsReq = Math.abs(1 * v); - frameTime = 1000 / fpsReq; - framesCount = 0; - return self; - } else { - return fpsReq; - } - }; - - /** - * Returns the actual average number of frames that are inserted per - * second. - * @return {number} The actual average FPS. - */ - function getFPS() { - if (isRunning) { - lastFPS = - Math.round( - framesCount / - ((new Date()).getTime() - currentTime) * - 10000 - ) / 10; - } - - return lastFPS; - }; - - /** - * Returns the number of tasks. - * @return {number} The number of tasks. - */ - function getTasksCount() { - return tasks.length; - } - - /** - * Returns the number of queued tasks. - * @return {number} The number of queued tasks. - */ - function getQueuedTasksCount() { - return queuedTasks.length; - } - - /** - * Returns how long sigma.chronos has active tasks running - * without interuption for, in ms. - * @return {number} The time chronos is running without interuption for. - */ - function getExecutionTime() { - return startTime - currentTime; - } - - this.frequency = frequency; - - this.runTasks = runTasks; - this.stopTasks = stopTasks; - this.insertFrame = insertFrame; - - this.addTask = addTask; - this.queueTask = queueTask; - this.removeTask = removeTask; - - this.addGenerator = addGenerator; - this.removeGenerator = removeGenerator; - this.startGenerators = startGenerators; - this.getGeneratorsIDs = getGeneratorsIDs; - - this.getFPS = getFPS; - this.getTasksCount = getTasksCount; - this.getQueuedTasksCount = getQueuedTasksCount; - this.getExecutionTime = getExecutionTime; - - return this; -})(); - -sigma.publicPrototype = SigmaPublic.prototype; -})(); - - --- /dev/null +++ b/js/app.js @@ -1,1 +1,95 @@ +/* Foundation v2.1.4 http://foundation.zurb.com */ +$(document).ready(function () { + /* Use this js doc for all application specific JS */ + + /* TABS --------------------------------- */ + /* Remove if you don't need :) */ + + function activateTab($tab) { + var $activeTab = $tab.closest('dl').find('a.active'), + contentLocation = $tab.attr("href") + 'Tab'; + + //Make Tab Active + $activeTab.removeClass('active'); + $tab.addClass('active'); + + //Show Tab Content + $(contentLocation).closest('.tabs-content').children('li').hide(); + $(contentLocation).show(); + } + + $('dl.tabs').each(function () { + //Get all tabs + var tabs = $(this).children('dd').children('a'); + tabs.click(function (e) { + activateTab($(this)); + }); + }); + + if (window.location.hash) { + activateTab($('a[href="' + window.location.hash + '"]')); + } + + /* ALERT BOXES ------------ */ + $(".alert-box").delegate("a.close", "click", function(event) { + event.preventDefault(); + $(this).closest(".alert-box").fadeOut(function(event){ + $(this).remove(); + }); + }); + + + /* PLACEHOLDER FOR FORMS ------------- */ + /* Remove this and jquery.placeholder.min.js if you don't need :) */ + + //$('input, textarea').placeholder(); + + + + /* UNCOMMENT THE LINE YOU WANT BELOW IF YOU WANT IE6/7/8 SUPPORT AND ARE USING .block-grids */ +// $('.block-grid.two-up>li:nth-child(2n+1)').css({clear: 'left'}); +// $('.block-grid.three-up>li:nth-child(3n+1)').css({clear: 'left'}); +// $('.block-grid.four-up>li:nth-child(4n+1)').css({clear: 'left'}); +// $('.block-grid.five-up>li:nth-child(5n+1)').css({clear: 'left'}); + + + + /* DROPDOWN NAV ------------- */ + + var currentFoundationDropdown = null; + $('.nav-bar li a, .nav-bar li a:after').each(function() { + $(this).data('clicks', 0); + }); + $('.nav-bar li a, .nav-bar li a:after').live('click', function(e) { + e.preventDefault(); + if (currentFoundationDropdown !== $(this).index() || currentFoundationDropdown === null) { + $(this).data('clicks', 0); + currentFoundationDropdown = $(this).index(); + } + $(this).data('clicks', ($(this).data('clicks') + 1)); + var f = $(this).siblings('.flyout'); + if (!f.is(':visible') && $(this).parent('.has-flyout').length > 1) { + $('.nav-bar li .flyout').hide(); + f.show(); + } else if (($(this).data('clicks') > 1) || ($(this).parent('.has-flyout').length < 1)) { + window.location = $(this).attr('href'); + } + }); + $('.nav-bar').live('click', function(e) { + e.stopPropagation(); + if ($(e.target).parents().is('.flyout') || $(e.target).is('.flyout')) { + e.preventDefault(); + } + }); + // $('body').bind('touchend', function(e) { + // if (!$(e.target).parents().is('.nav-bar') || !$(e.target).is('.nav-bar')) { + // $('.nav-bar li .flyout').is(':visible').hide(); + // } + // }); + + /* DISABLED BUTTONS ------------- */ + /* Gives elements with a class of 'disabled' a return: false; */ + +}); + --- /dev/null +++ b/js/d3.layout.min.js @@ -1,1 +1,1 @@ - +(function(){function bh(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function bg(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function bf(a){var b=0,c=0,d=a.children,e=d.length,f;while(--e>=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function be(a,b){function c(a,d){var e=a.children;if(e){var f,g=null,h=-1,i=e.length;while(++h0&&(a=d)}return a}function _(a){return a.children?a.children[a.children.length-1]:a._tree.thread}function $(a){return a.children?a.children[0]:a._tree.thread}function Z(a,b){return a.parent==b.parent?1:2}function Y(a){var b=a.children;return b?Y(b[b.length-1]):a}function X(a){var b=a.children;return b?X(b[0]):a}function W(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function V(a){return 1+d3.max(a,function(a){return a.y})}function U(a,b,c){var d=b.r+c.r,e=a.r+c.r,f=b.x-a.x,g=b.y-a.y,h=Math.sqrt(f*f+g*g),i=(e*e+h*h-d*d)/(2*e*h),j=Math.acos(i),k=i*e,l=Math.sin(j)*e;f/=h,g/=h,c.x=a.x+k*f+l*g,c.y=a.y+k*g-l*f}function T(a,b,c,d){var e=a.children;a.x=b+=d*a.x,a.y=c+=d*a.y,a.r*=d;if(e){var f=-1,g=e.length;while(++f1){h=a[1],h.x=h.r,h.y=0,l(h);if(f>2){i=a[2],U(g,h,i),l(i),M(g,i),g._pack_prev=i,M(i,h),h=g._pack_next;for(var m=3;m0?(N(g,j),h=j,m--):(N(j,h),g=j,m--)}}}var q=(b+c)/2,r=(d+e)/2,s=0;for(var m=0;m.001}function N(a,b){a._pack_next=b,b._pack_prev=a}function M(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function L(a,b){return a.value-b.value}function J(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function I(a,b){return b.value-a.value}function H(a){return a.value}function G(a){return a.children}function F(a,b){a.sort=d3.rebind(a,b.sort),a.children=d3.rebind(a,b.children),a.links=J,a.value=d3.rebind(a,b.value),a.nodes=function(b){K=!0;return(a.nodes=a)(b)};return a}function E(a){return[d3.min(a),d3.max(a)]}function D(a,b){var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];while(++c<=b)f[c]=e*c+d;return f}function C(a,b){return D(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function B(a,b){return a+b[1]}function A(a){return a.reduce(B,0)}function z(a){var b=1,c=0,d=a[0][1],e,f=a.length;for(;bd&&(c=b,d=e);return c}function w(a,b,c){a.y0=b,a.y=c}function v(a){return a.y}function u(a){return a.x}function t(a){return 1}function s(a){return 20}function r(a){var b=0,c=0;a.count=0;if(!a.leaf){var d=a.nodes,e=d.length,f=-1,g;while(++fe&&(e=h),d.push(h)}for(g=0;g=i[0]&&o<=i[1]&&(k=g[d3.bisect(j,o,1,m)-1],k.y+=n,k.push(e[f]));return g}var a=!0,b=Number,c=E,d=C;e.value=function(a){if(!arguments.length)return b;b=a;return e},e.range=function(a){if(!arguments.length)return c;c=d3.functor(a);return e},e.bins=function(a){if(!arguments.length)return d;d=typeof a=="number"?function(b){return D(b,a)}:d3.functor(a);return e},e.frequency=function(b){if(!arguments.length)return a;a=!!b;return e};return e},d3.layout.hierarchy=function(){function g(a){var b=[];e(a,0,b);return b}function f(a,b){var d=a.children,e=0;if(d){var h=-1,i=d.length,j=b+1;while(++h0&&(bg(bh(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!_(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!$(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}function i(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c){var d=-1,e=c.length;b+=a._tree.mod;while(++dd.dy)j=d.dy;while(++fd.dx)j=d.dx;while(++fe&&(e=d);c*=c,b*=b;return g||e?Math.max(b*e*f/c,c/(b*g*f)):Infinity}function i(a){if(!!a.children){var b={x:a.x,y:a.y,dx:a.dx,dy:a.dy},c=a.children.slice(),d,e=[];e.area=0;while(d=c.pop())e.push(d),e.area+=d.area,d.z!=null&&(k(e,d.z?b.dx:b.dy,b,!c.length),e.length=e.area=0);a.children.forEach(i)}}function h(a){if(!!a.children){var b={x:a.x,y:a.y,dx:a.dx,dy:a.dy},c=[],d=a.children.slice(),e,f=Infinity,g,i=Math.min(b.dx,b.dy),l;c.area=0;while((l=d.length)>0)c.push(e=d[l-1]),c.area+=e.area,(g=j(c,i))<=f?(d.pop(),f=g):(c.area-=c.pop().area,k(c,i,b,!1),i=Math.min(b.dx,b.dy),c.length=c.area=0,f=Infinity);c.length&&(k(c,i,b,!0),c.length=c.area=0),a.children.forEach(h)}}function g(a,b){var c=a.children,d=a.value;a.area=isNaN(d)||d<0?0:d*b;if(c){var e=-1,f=c.length;while(++e9&&(f=c*3/Math.sqrt(f),g[h]=f*d,g[h+1]=f*e));h=-1;while(++h<=i)f=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),b.push([f||0,g[h]*f||0]);return b}function cc(a){var b=0,c=a.length-1,d=[],e=a[0],f=a[1],g=d[0]=cb(e,f);while(++b1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;jc.delay&&(c.flush=c.callback(a)),c=c.next;var d=bg()-b;d>24?(isFinite(d)&&(clearTimeout(bd),bd=setTimeout(bf,d)),bc=0):(bc=1,bh(bf))}function be(a,b){var c=Date.now(),d=!1,e,f=bb;if(!!isFinite(b)){while(f){if(f.callback===a){f.then=c,f.delay=b,d=!0;break}e=f,f=f.next}d||(bb={callback:a,then:c,delay:b,next:bb}),bc||(bd=clearTimeout(bd),bc=1,bh(bf))}}function ba(a){return typeof a=="function"?function(b,c,d){var e=a.call(this,b,c)+"";return d!=e&&d3.interpolate(d,e)}:(a=a+"",function(b,c,d){return d!=a&&d3.interpolate(d,a)})}function _(a){function n(b){var h=!0,l=-1;a.each(function(){if(i[++l]!==2){var a=(b-j[l])/k[l],n=this.__transition__,o,p,q=e[l];if(a<1){h=!1;if(a<0)return}else a=1;if(i[l]){if(!n||n.active!==c){i[l]=2;return}}else{if(!n||n.active>c){i[l]=2;return}i[l]=1,g.start.dispatch.apply(this,arguments),q=e[l]={},n.active=c;for(p in d)if(o=d[p].apply(this,arguments))q[p]=o}o=m(a);for(p in q)q[p].call(this,o);if(a===1){i[l]=2;if(n.active===c){var r=n.owner;r===c&&(delete this.__transition__,f&&this.parentNode&&this.parentNode.removeChild(this)),$=c,g.end.dispatch.apply(this,arguments),$=0,n.owner=r}}}});return h}var b={},c=$||++Z,d={},e=[],f=!1,g=d3.dispatch("start","end"),i=[],j=[],k=[],l,m=d3.ease("cubic-in-out");a.each(function(){(this.__transition__||(this.__transition__={})).owner=c}),b.delay=function(c){var d=Infinity,e=-1;typeof c=="function"?a.each(function(a,b){var f=j[++e]=+c.apply(this,arguments);fl&&(l=e)})):(l=+c,a.each(function(a,b){k[++d]=l}));return b},b.ease=function(a){m=typeof a=="function"?a:d3.ease.apply(d3,arguments);return b},b.attrTween=function(a,c){function f(b,d){var e=c.call(this,b,d,this.getAttributeNS(a.space,a.local));return e&&function(b){this.setAttributeNS(a.space,a.local,e(b))}}function e(b,d){var e=c.call(this,b,d,this.getAttribute(a));return e&&function(b){this.setAttribute(a,e(b))}}d["attr."+a]=a.local?f:e;return b},b.attr=function(a,c){return b.attrTween(a,ba(c))},b.styleTween=function(a,c,e){function f(b,d){var f=c.call(this,b,d,window.getComputedStyle(this,null).getPropertyValue(a));return f&&function(b){this.style.setProperty(a,f(b),e)}}arguments.length<3&&(e=null),d["style."+a]=f;return b},b.style=function(a,c,d){arguments.length<3&&(d=null);return b.styleTween(a,ba(c),d)},b.text=function(a){d.text=function(b,c){this.textContent=typeof a=="function"?a.call(this,b,c):a};return b},b.select=function(b){var c,d=_(a.select(b)).ease(m);c=-1,d.delay(function(a,b){return j[++c]}),c=-1,d.duration(function(a,b){return k[++c]});return d},b.selectAll=function(b){var c,d=_(a.selectAll(b)).ease(m);c=-1,d.delay(function(a,b){return j[b?c:++c]}),c=-1,d.duration(function(a,b){return k[b?c:++c]});return d},b.remove=function(){f=!0;return b},b.each=function(a,c){g[a].add(c);return b},b.call=h;return b.delay(0).duration(250)}function Y(a){return{__data__:a}}function X(a){arguments.length||(a=d3.ascending);return function(b,c){return a(b&&b.__data__,c&&c.__data__)}}function W(a){function b(b){var c=[],d,e,f,g;for(var h=0,i=a.length;h360?a-=360:a<0&&(a+=360);if(a<60)return d+(e-d)*a/60;if(a<180)return e;if(a<240)return d+(e-d)*(240-a)/60;return d}var d,e;a=a%360,a<0&&(a+=360),b=b<0?0:b>1?1:b,c=c<0?0:c>1?1:c,e=c<=.5?c*(1+b):c+b-c*b,d=2*c-e;return H(g(a+120),g(a),g(a-120))}function Q(a,b,c){this.h=a,this.s=b,this.l=c}function P(a,b,c){return new Q(a,b,c)}function M(a){var b=parseFloat(a);return a.charAt(a.length-1)==="%"?Math.round(b*2.55):b}function L(a,b,c){var d=Math.min(a/=255,b/=255,c/=255),e=Math.max(a,b,c),f=e-d,g,h,i=(e+d)/2;f?(h=i<.5?f/(e+d):f/(2-e-d),a==e?g=(b-c)/f+(b=0?a.substring(b):(b=a.length,""),d=[];while(b>0)d.push(a.substring(b-=3,b+3));return d.reverse().join(",")+c}function m(a){return a+""}function j(a){var b={},c=[];b.add=function(a){for(var d=0;db?1:0},d3.descending=function(a,b){return ba?1:0},d3.min=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++cf&&(e=f)}else{while(++cf&&(e=f)}return e},d3.max=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++ce&&(e=f)}else{while(++ce&&(e=f)}return e},d3.sum=function(a,b){var c=0,d=a.length,e,f=-1;if(arguments.length===1)while(++f>1;a[e]>1;b0&&(e=f);return e},d3.last=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c=b.length)return a;var e=[],f=c[d++],h;for(h in a)e.push({key:h,values:g(a[h],d)});f&&e.sort(function(a,b){return f(a.key,b.key)});return e}function f(c,g){if(g>=b.length)return e?e.call(a,c):d?c.sort(d):c;var h=-1,i=c.length,j=b[g++],k,l,m={};while(++hb)d.push(f);else while((f=a+c*++e)=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,l={g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){var c=1+Math.floor(1e-15+Math.log(a)/Math.LN10);return d3.round(a,b-c).toFixed(Math.max(0,b-c))}},o=v(2),p=v(3),q={linear:function(){return u},poly:v,quad:function(){return o},cubic:function(){return p},sin:function(){return w},exp:function(){return x},circle:function(){return y},elastic:z,back:A,bounce:function(){return B}},r={"in":function(a){return a},out:s,"in-out":t,"out-in":function(a){return t(s(a))}};d3.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return r[d](q[c].apply(null,Array.prototype.slice.call(arguments,1)))},d3.event=null,d3.interpolate=function(a,b){var c=d3.interpolators.length,d;while(--c>=0&&!(d=d3.interpolators[c](a,b)));return d},d3.interpolateNumber=function(a,b){b-=a;return function(c){return a+b*c}},d3.interpolateRound=function(a,b){b-=a;return function(c){return Math.round(a+b*c)}},d3.interpolateString=function(a,b){var c,d,e,f=0,g=0,h=[],i=[],j,k;C.lastIndex=0;for(d=0;c=C.exec(b);++d)c.index&&h.push(b.substring(f,g=c.index)),i.push({i:h.length,x:c[0]}),h.push(null),f=C.lastIndex;f0;j--)e.push(c(f)*j)}else{for(;fi;g--);e=e.slice(f,g)}return e},d.tickFormat=function(){return bu};return bl(d,a)},bs.pow=function(a){return Math.pow(10,a)},bt.pow=function(a){return-Math.pow(10,-a)},d3.scale.pow=function(){function e(b){return a(c(b))}var a=d3.scale.linear(),b=1,c=Number,d=c;e.invert=function(b){return d(a.invert(b))},e.domain=function(f){if(!arguments.length)return a.domain().map(d);var g=(f[0]||f[f.length-1])<0?bw:bv;c=g(b),d=g(1/b),a.domain(f.map(c));return e},e.ticks=function(a){return bo(e.domain(),a)},e.tickFormat=function(a){return bp(e.domain(),a)},e.nice=function(){return e.domain(bj(e.domain(),bm))},e.exponent=function(a){if(!arguments.length)return b;var c=e.domain();b=a;return e.domain(c)};return bl(e,a)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){function e(d){var e=d in b?b[d]:b[d]=a.push(d)-1;return c[e%c.length]}var a=[],b={},c=[],d=0;e.domain=function(c){if(!arguments.length)return a;a=c,b={};var d=-1,f=-1,g=a.length;while(++d=bC?e?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+e+"A"+e+","+e+" 0 1,1 0,"+ -e+"A"+e+","+e+" 0 1,1 0,"+e+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":e?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+e*m+","+e*n+"A"+e+","+e+" 0 "+j+",0 "+e*k+","+e*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0"+"Z"}var a=bD,b=bE,c=bF,d=bG;e.innerRadius=function(b){if(!arguments.length)return a;a=d3.functor(b);return e},e.outerRadius=function(a){if(!arguments.length)return b;b=d3.functor(a);return e},e.startAngle=function(a){if(!arguments.length)return c;c=d3.functor(a);return e},e.endAngle=function(a){if(!arguments.length)return d;d=d3.functor(a);return e},e.centroid=function(){var e=(a.apply(this,arguments)+b.apply(this,arguments))/2,f=(c.apply(this,arguments)+d.apply(this,arguments))/2+bB;return[Math.cos(f)*e,Math.sin(f)*e]};return e};var bB=-Math.PI/2,bC=2*Math.PI-1e-6;d3.svg.line=function(){return bH(Object)};var bL={linear:bM,"step-before":bN,"step-after":bO,basis:bU,"basis-open":bV,"basis-closed":bW,bundle:bX,cardinal:bR,"cardinal-open":bP,"cardinal-closed":bQ,monotone:ce},bZ=[0,2/3,1/3,0],b$=[0,1/3,2/3,0],b_=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var a=bH(cf);a.radius=a.x,delete a.x,a.angle=a.y,delete a.y;return a},d3.svg.area=function(){return cg(Object)},d3.svg.area.radial=function(){var a=cg(cf);a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1;return a},d3.svg.chord=function(){function j(a,b,c,d){return"Q 0,0 "+d}function i(a,b){return"A"+a+","+a+" 0 0,1 "+b}function h(a,b){return a.a0==b.a0&&a.a1==b.a1}function g(a,b,f,g){var h=b.call(a,f,g),i=c.call(a,h,g),j=d.call(a,h,g)+bB,k=e.call(a,h,g)+bB;return{r:i,a0:j,a1:k,p0:[i*Math.cos(j),i*Math.sin(j)],p1:[i*Math.cos(k),i*Math.sin(k)]}}function f(c,d){var e=g(this,a,c,d),f=g(this,b,c,d);return"M"+e.p0+i(e.r,e.p1)+(h(e,f)?j(e.r,e.p1,e.r,e.p0):j(e.r,e.p1,f.r,f.p0)+i(f.r,f.p1)+j(f.r,f.p1,e.r,e.p0))+"Z"}var a=cj,b=ck,c=cl,d=bF,e=bG;f.radius=function(a){if(!arguments.length)return c;c=d3.functor(a);return f},f.source=function(b){if(!arguments.length)return a;a=d3.functor(b);return f},f.target=function(a){if(!arguments.length)return b;b=d3.functor(a);return f},f.startAngle=function(a){if(!arguments.length)return d;d=d3.functor(a);return f},f.endAngle=function(a){if(!arguments.length)return e;e=d3.functor(a);return f};return f},d3.svg.diagonal=function(){function d(d,e){var f=a.call(this,d,e),g=b.call(this,d,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];i=i.map(c);return"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var a=cj,b=ck,c=co;d.source=function(b){if(!arguments.length)return a;a=d3.functor(b);return d},d.target=function(a){if(!arguments.length)return b;b=d3.functor(a);return d},d.projection=function(a){if(!arguments.length)return c;c=a;return d};return d},d3.svg.diagonal.radial=function(){var a=d3.svg.diagonal(),b=co,c=a.projection;a.projection=function(a){return arguments.length?c(cp(b=a)):b};return a},d3.svg.mouse=function(a){return cr(a,d3.event)};var cq=/WebKit/.test(navigator.userAgent)?-1:0;d3.svg.touches=function(b){var c=d3.event.touches;return c?a(c).map(function(a){var c=cr(b,a);c.identifier=a.identifier;return c}):[]},d3.svg.symbol=function(){function c(c,d){return(cu[a.call(this,c,d)]||cu.circle)(b.call(this,c,d))}var a=ct,b=cs;c.type=function(b){if(!arguments.length)return a;a=d3.functor(b);return c},c.size=function(a){if(!arguments.length)return b;b=d3.functor(a);return c};return c};var cu={circle:function(a){var b=Math.sqrt(a/Math.PI);return"M0,"+b+"A"+b+","+b+" 0 1,1 0,"+ -b+"A"+b+","+b+" 0 1,1 0,"+b+"Z"},cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+ -3*b+","+ -b+"H"+ -b+"V"+ -3*b+"H"+b+"V"+ -b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+ -b+"V"+b+"H"+ -3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*cw)),c=b*cw;return"M0,"+ -b+"L"+c+",0"+" 0,"+b+" "+ -c+",0"+"Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+ -b+","+ -b+"L"+b+","+ -b+" "+b+","+b+" "+ -b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/cv),c=b*cv/2;return"M0,"+c+"L"+b+","+ -c+" "+ -b+","+ -c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/cv),c=b*cv/2;return"M0,"+ -c+"L"+b+","+c+" "+ -b+","+c+"Z"}};d3.svg.symbolTypes=d3.keys(cu);var cv=Math.sqrt(3),cw=Math.tan(30*Math.PI/180)})() --- /dev/null +++ b/js/foundation.js @@ -1,1 +1,14 @@ +/* Foundation v2.1.4 http://foundation.zurb.com */ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement){cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close()}d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border"){for(;g=0===c})}function S(a){return !a||!a.parentNode||a.parentNode.nodeType===11}function K(){return !0}function J(){return !1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b])){continue}if(b!=="toJSON"){return !1}}return !0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else{d=b}}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a){return this}if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2]){return f.find(a)}this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return !d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a)){return f.ready(a)}a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0){return}A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete"){return setTimeout(e.ready,1)}if(c.addEventListener){c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1)}else{if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval" in a},isNumeric:function(a){return !isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a)){return !1}try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf")){return !1}}catch(c){return !1}var d;for(d in a){}return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a){return !1}return !0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b){return null}b=e.trim(b);if(a.JSON&&a.JSON.parse){return a.JSON.parse(b)}if(n.test(b.replace(o,"@").replace(p,"]").replace(q,""))){return(new Function("return "+b))()}e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a){if(c.apply(a[f],d)===!1){break}}}else{for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k){for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e){return{}}g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent){for(o in {submit:1,change:1,focusin:1}){n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p}}k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
    ",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
    t
    ",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
    ",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return !!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b){return}n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function"){e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c)}g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c]){return g.events}k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k]){return}if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1){return !0}}return !1},val:function(a){var c,d,e,g=this[0];if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set" in c)||c.set(this,h,"value")===b){this.value=h}}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get" in c&&(d=c.get(g,"value"))!==b){return d}d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return !b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0){return null}c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn){return f(a)[c](d)}if(typeof a.getAttribute=="undefined"){return f.prop(a,c,d)}i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set" in h&&i&&(g=h.set(a,d,c))!==b){return g}a.setAttribute(c,""+d);return d}if(h&&"get" in h&&i&&(g=h.get(a,c))!==null){return g}g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h]){return}c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j){j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0)}return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1){return}r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode){r.push([m,s]),n=m}n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9){return[]}if(!b||typeof b!="string"){return e}var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b)){if(w.length===2&&o.relative[w[0]]){j=y(w[0]+w[1],d,f)}else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length){b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}}}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length){q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}}else{k=w=[]}}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]"){if(!u){e.push.apply(e,k)}else{if(d&&d.nodeType===1){for(t=0;k[t]!=null;t++){k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t])}}else{for(t=0;k[t]!=null;t++){k[t]&&k[t].nodeType===1&&e.push(j[t])}}}}else{s(k,e)}l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h){for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a){return[]}for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1))}return !1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else{a[2]&&m.error(a[0])}a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not"){if((a.exec(b[3])||"").length>1||/^\w/.test(b[3])){b[3]=m(b[3],null,null,c)}else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return !1}}else{if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0])){return !0}}return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return !!a.firstChild},empty:function(a){return !a.firstChild},has:function(a,b,c){return !!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f){return f(a,c,b,d)}if(e==="contains"){return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0}if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f){return f(a,c,b,d)}}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match){o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q))}var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]"){Array.prototype.push.apply(d,a)}else{if(typeof a.length=="number"){for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++){c[e].nodeType===1&&d.push(c[e])}c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1]){return s(e.getElementsByTagName(b),f)}if(h[2]&&o.find.CLASS&&e.getElementsByClassName){return s(e.getElementsByClassName(h[2]),f)}}if(e.nodeType===9){if(b==="body"&&e.body){return s([e.body],f)}if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode){return s([],f)}if(i.id===h[3]){return s([i],f)}}try{return s(e.querySelectorAll(b),f)}catch(j){}}else{if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p){return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}}catch(r){}finally{l||k.removeAttribute("id")}}}}return a(b,e,f,g)};for(var e in a){m[e]=a[e]}b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a)){try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11){return f}}}catch(g){}}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1){return}o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c){return b.getElementsByClassName(a[1])}},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return !!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return !1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a)){f+=d[0],a=a.replace(o.match.PSEUDO,"")}a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0){for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11){break}}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a){return this[0]&&this[0].parentNode?this.prevAll().length:-1}if(typeof a=="string"){return f.inArray(this[0],f(a))}return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d))){g.nodeType===1&&e.push(g),g=g[c]}return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c]){if(a.nodeType===1&&++e===b){break}}return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling){a.nodeType===1&&a!==b&&c.push(a)}return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a)){return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))})}if(typeof a!="object"&&a!==b){return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))}return f.text(this)},wrapAll:function(a){if(f.isFunction(a)){return this.each(function(b){f(this).wrapAll(a.call(this,b))})}if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1){a=a.firstChild}return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a)){return this.each(function(b){f(this).wrapInner(a.call(this,b))})}return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)})}if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)})}if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++){if(!a||f.filter(a,[d]).length){!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d)}}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild){b.removeChild(b.firstChild)}}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null}if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g){e[g]&&bk(d[g],e[g])}}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g){bj(d[g],e[g])}}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k){continue}if(typeof k=="string"){if(!_.test(k)){k=b.createTextNode(k)}else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--){o=o.lastChild}if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i){f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}}var r;if(!f.support.appendChecked){if(k[0]&&typeof(r=k.length)=="number"){for(i=0;i=0){return b+"px"}}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter){return}}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return !f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS){return bS.apply(this,arguments)}if(!this.length){return this}var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified")){f.lastModified[k]=y}if(z=v.getResponseHeader("Etag")){f.etag[k]=z}}if(a===304){w="notmodified",o=!0}else{try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}}else{u=w;if(!w||a){w="error",a<0&&(a=0)}}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n)){o[c[1].toLowerCase()]=c[2]}}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2){for(b in a){j[b]=[j[b],a[b]]}}else{b=a[v.status],v.then(b,b)}}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2){return !1}t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers){v.setRequestHeader(u,d.headers[u])}if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return !1}for(u in {success:1,error:1,complete:1}){v[u](d[u])}p=b$(bU,d,c,v);if(!p){w(-1,"No Transport")}else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2){w(-1,z)}else{throw z}}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a)){f.each(a,function(){e(this.name,this.value)})}else{for(var g in a){ca(g,a[g],c,e)}}return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState)){d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")}},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch){ch[a](0,1)}}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return !this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials" in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields){for(j in c.xhrFields){h[j]=c.xhrFields[j]}}c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e){h.setRequestHeader(j,e[j])}}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e){h.readyState!==4&&h.abort()}else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0){return this.animate(cu("show",3),a,b,c)}for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties){i.animatedProperties[b]!==!0&&(g=!1)}if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show){for(b in i.animatedProperties){f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0)}}d=i.complete,d&&(i.complete=!1,d.call(h))}return !1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return !0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using" in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0]){return null}var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static"){a=a.offsetParent}return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e){return null}g=cy(e);return g?"pageXOffset" in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e){return a==null?null:this}if(f.isFunction(a)){return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))})}if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9){return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c])}if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);(function(a){a("a[data-reveal-id]").live("click",function(c){c.preventDefault();var b=a(this).attr("data-reveal-id");a("#"+b).reveal(a(this).data())});a.fn.reveal=function(b){var c={animation:"fadeAndPop",animationSpeed:300,closeOnBackgroundClick:true,dismissModalClass:"close-reveal-modal"};var b=a.extend({},c,b);return this.each(function(){var l=a(this),g=parseInt(l.css("top")),i=l.height()+g,h=false,e=a(".reveal-modal-bg");if(e.length==0){e=a('
    ').insertAfter(l);e.fadeTo("fast",0.8)}function k(){e.unbind("click.modalEvent");a("."+b.dismissModalClass).unbind("click.modalEvent");if(!h){m();if(b.animation=="fadeAndPop"){l.css({top:a(document).scrollTop()-i,opacity:0,visibility:"visible"});e.fadeIn(b.animationSpeed/2);l.delay(b.animationSpeed/2).animate({top:a(document).scrollTop()+g+"px",opacity:1},b.animationSpeed,j)}if(b.animation=="fade"){l.css({opacity:0,visibility:"visible",top:a(document).scrollTop()+g});e.fadeIn(b.animationSpeed/2);l.delay(b.animationSpeed/2).animate({opacity:1},b.animationSpeed,j)}if(b.animation=="none"){l.css({visibility:"visible",top:a(document).scrollTop()+g});e.css({display:"block"});j()}}l.unbind("reveal:open",k)}l.bind("reveal:open",k);function f(){if(!h){m();if(b.animation=="fadeAndPop"){e.delay(b.animationSpeed).fadeOut(b.animationSpeed);l.animate({top:a(document).scrollTop()-i+"px",opacity:0},b.animationSpeed/2,function(){l.css({top:g,opacity:1,visibility:"hidden"});j()})}if(b.animation=="fade"){e.delay(b.animationSpeed).fadeOut(b.animationSpeed);l.animate({opacity:0},b.animationSpeed,function(){l.css({opacity:1,visibility:"hidden",top:g});j()})}if(b.animation=="none"){l.css({visibility:"hidden",top:g});e.css({display:"none"})}}l.unbind("reveal:close",f)}l.bind("reveal:close",f);l.trigger("reveal:open");var d=a("."+b.dismissModalClass).bind("click.modalEvent",function(){l.trigger("reveal:close")});if(b.closeOnBackgroundClick){e.css({cursor:"pointer"});e.bind("click.modalEvent",function(){l.trigger("reveal:close")})}a("body").keyup(function(n){if(n.which===27){l.trigger("reveal:close")}});function j(){h=false}function m(){h=true}})}})(jQuery);(function(b){var a={defaults:{animation:"horizontal-push",animationSpeed:600,timer:true,advanceSpeed:4000,pauseOnHover:false,startClockOnMouseOut:false,startClockOnMouseOutAfter:1000,directionalNav:true,captions:true,captionAnimation:"fade",captionAnimationSpeed:600,bullets:false,bulletThumbs:false,bulletThumbLocation:"",afterSlideChange:b.noop,fluid:true,centerBullets:true},activeSlide:0,numberSlides:0,orbitWidth:null,orbitHeight:null,locked:null,timerRunning:null,degrees:0,wrapperHTML:'
    ',timerHTML:'
    ',captionHTML:'
    ',directionalNavHTML:'
    RightLeft
    ',bulletHTML:'
      ',init:function(f,e){var c,g=0,d=this;this.clickTimer=b.proxy(this.clickTimer,this);this.addBullet=b.proxy(this.addBullet,this);this.resetAndUnlock=b.proxy(this.resetAndUnlock,this);this.stopClock=b.proxy(this.stopClock,this);this.startTimerAfterMouseLeave=b.proxy(this.startTimerAfterMouseLeave,this);this.clearClockMouseLeaveTimer=b.proxy(this.clearClockMouseLeaveTimer,this);this.rotateTimer=b.proxy(this.rotateTimer,this);this.options=b.extend({},this.defaults,e);if(this.options.timer==="false"){this.options.timer=false}if(this.options.captions==="false"){this.options.captions=false}if(this.options.directionalNav==="false"){this.options.directionalNav=false}this.$element=b(f);this.$wrapper=this.$element.wrap(this.wrapperHTML).parent();this.$slides=this.$element.children("img, a, div");this.$element.bind("orbit.next",function(){d.shift("next")});this.$element.bind("orbit.prev",function(){d.shift("prev")});this.$element.bind("orbit.goto",function(i,h){d.shift(h)});this.$element.bind("orbit.start",function(i,h){d.startClock()});this.$element.bind("orbit.stop",function(i,h){d.stopClock()});c=this.$slides.filter("img");if(c.length===0){this.loaded()}else{c.bind("imageready",function(){g+=1;if(g===c.length){d.loaded()}})}},loaded:function(){this.$element.addClass("orbit").css({width:"1px",height:"1px"});this.setDimentionsFromLargestSlide();this.updateOptionsIfOnlyOneSlide();this.setupFirstSlide();if(this.options.timer){this.setupTimer();this.startClock()}if(this.options.captions){this.setupCaptions()}if(this.options.directionalNav){this.setupDirectionalNav()}if(this.options.bullets){this.setupBulletNav();this.setActiveBullet()}},currentSlide:function(){return this.$slides.eq(this.activeSlide)},setDimentionsFromLargestSlide:function(){var d=this,c;d.$element.add(d.$wrapper).width(this.$slides.first().width());d.$element.add(d.$wrapper).height(this.$slides.first().height());d.orbitWidth=this.$slides.first().width();d.orbitHeight=this.$slides.first().height();c=this.$slides.first().clone();this.$slides.each(function(){var e=b(this),g=e.width(),f=e.height();if(g>d.$element.width()){d.$element.add(d.$wrapper).width(g);d.orbitWidth=d.$element.width()}if(f>d.$element.height()){d.$element.add(d.$wrapper).height(f);d.orbitHeight=d.$element.height();c=b(this).clone()}d.numberSlides+=1});if(this.options.fluid){if(typeof this.options.fluid==="string"){c=b('')}d.$element.prepend(c);c.addClass("fluid-placeholder");d.$element.add(d.$wrapper).css({width:"inherit"});d.$element.add(d.$wrapper).css({height:"inherit"});b(window).bind("resize",function(){d.orbitWidth=d.$element.width();d.orbitHeight=d.$element.height()})}},lock:function(){this.locked=true},unlock:function(){this.locked=false},updateOptionsIfOnlyOneSlide:function(){if(this.$slides.length===1){this.options.directionalNav=false;this.options.timer=false;this.options.bullets=false}},setupFirstSlide:function(){var c=this;this.$slides.first().css({"z-index":3}).fadeIn(function(){c.$slides.css({display:"block"})})},startClock:function(){var c=this;if(!this.options.timer){return false}if(this.$timer.is(":hidden")){this.clock=setInterval(function(){this.$element.trigger("orbit.next")},this.options.advanceSpeed)}else{this.timerRunning=true;this.$pause.removeClass("active");this.clock=setInterval(this.rotateTimer,this.options.advanceSpeed/180)}},rotateTimer:function(){var c="rotate("+this.degrees+"deg)";this.degrees+=2;this.$rotator.css({"-webkit-transform":c,"-moz-transform":c,"-o-transform":c});if(this.degrees>180){this.$rotator.addClass("move");this.$mask.addClass("move")}if(this.degrees>360){this.$rotator.removeClass("move");this.$mask.removeClass("move");this.degrees=0;this.$element.trigger("orbit.next")}},stopClock:function(){if(!this.options.timer){return false}else{this.timerRunning=false;clearInterval(this.clock);this.$pause.addClass("active")}},setupTimer:function(){this.$timer=b(this.timerHTML);this.$wrapper.append(this.$timer);this.$rotator=this.$timer.find(".rotator");this.$mask=this.$timer.find(".mask");this.$pause=this.$timer.find(".pause");this.$timer.click(this.clickTimer);if(this.options.startClockOnMouseOut){this.$wrapper.mouseleave(this.startTimerAfterMouseLeave);this.$wrapper.mouseenter(this.clearClockMouseLeaveTimer)}if(this.options.pauseOnHover){this.$wrapper.mouseenter(this.stopClock)}},startTimerAfterMouseLeave:function(){var c=this;this.outTimer=setTimeout(function(){if(!c.timerRunning){c.startClock()}},this.options.startClockOnMouseOutAfter)},clearClockMouseLeaveTimer:function(){clearTimeout(this.outTimer)},clickTimer:function(){if(!this.timerRunning){this.startClock()}else{this.stopClock()}},setupCaptions:function(){this.$caption=b(this.captionHTML);this.$wrapper.append(this.$caption);this.setCaption()},setCaption:function(){var d=this.currentSlide().attr("data-caption"),c;if(!this.options.captions){return false}if(d){c=b(d).html();this.$caption.attr("id",d).html(c);switch(this.options.captionAnimation){case"none":this.$caption.show();break;case"fade":this.$caption.fadeIn(this.options.captionAnimationSpeed);break;case"slideOpen":this.$caption.slideDown(this.options.captionAnimationSpeed);break}}else{switch(this.options.captionAnimation){case"none":this.$caption.hide();break;case"fade":this.$caption.fadeOut(this.options.captionAnimationSpeed);break;case"slideOpen":this.$caption.slideUp(this.options.captionAnimationSpeed);break}}},setupDirectionalNav:function(){var c=this;this.$wrapper.append(this.directionalNavHTML);this.$wrapper.find(".left").click(function(){c.stopClock();c.$element.trigger("orbit.prev")});this.$wrapper.find(".right").click(function(){c.stopClock();c.$element.trigger("orbit.next")})},setupBulletNav:function(){this.$bullets=b(this.bulletHTML);this.$wrapper.append(this.$bullets);this.$slides.each(this.addBullet);this.$element.addClass("with-bullets");if(this.options.centerBullets){this.$bullets.css("margin-left",-this.$bullets.width()/2)}},addBullet:function(g,e){var d=g+1,h=b("
    • "+(d)+"
    • "),c,f=this;if(this.options.bulletThumbs){c=b(e).attr("data-thumb");if(c){h.addClass("has-thumb").css({background:"url("+this.options.bulletThumbLocation+c+") no-repeat"})}}this.$bullets.append(h);h.data("index",g);h.click(function(){f.stopClock();f.$element.trigger("orbit.goto",[h.data("index")])})},setActiveBullet:function(){if(!this.options.bullets){return false}else{this.$bullets.find("li").removeClass("active").eq(this.activeSlide).addClass("active")}},resetAndUnlock:function(){this.$slides.eq(this.prevActiveSlide).css({"z-index":1});this.unlock();this.options.afterSlideChange.call(this,this.$slides.eq(this.prevActiveSlide),this.$slides.eq(this.activeSlide))},shift:function(d){var c=d;this.prevActiveSlide=this.activeSlide;if(this.prevActiveSlide==c){return false}if(this.$slides.length=="1"){return false}if(!this.locked){this.lock();if(d=="next"){this.activeSlide++;if(this.activeSlide==this.numberSlides){this.activeSlide=0}}else{if(d=="prev"){this.activeSlide--;if(this.activeSlide<0){this.activeSlide=this.numberSlides-1}}else{this.activeSlide=d;if(this.prevActiveSlidethis.activeSlide){c="prev"}}}}this.setActiveBullet();this.$slides.eq(this.prevActiveSlide).css({"z-index":2});if(this.options.animation=="fade"){this.$slides.eq(this.activeSlide).css({opacity:0,"z-index":3}).animate({opacity:1},this.options.animationSpeed,this.resetAndUnlock)}if(this.options.animation=="horizontal-slide"){if(c=="next"){this.$slides.eq(this.activeSlide).css({left:this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock)}if(c=="prev"){this.$slides.eq(this.activeSlide).css({left:-this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock)}}if(this.options.animation=="vertical-slide"){if(c=="prev"){this.$slides.eq(this.activeSlide).css({top:this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock)}if(c=="next"){this.$slides.eq(this.activeSlide).css({top:-this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock)}}if(this.options.animation=="horizontal-push"){if(c=="next"){this.$slides.eq(this.activeSlide).css({left:this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({left:-this.orbitWidth},this.options.animationSpeed)}if(c=="prev"){this.$slides.eq(this.activeSlide).css({left:-this.orbitWidth,"z-index":3}).animate({left:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({left:this.orbitWidth},this.options.animationSpeed)}}if(this.options.animation=="vertical-push"){if(c=="next"){this.$slides.eq(this.activeSlide).css({top:-this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({top:this.orbitHeight},this.options.animationSpeed)}if(c=="prev"){this.$slides.eq(this.activeSlide).css({top:this.orbitHeight,"z-index":3}).animate({top:0},this.options.animationSpeed,this.resetAndUnlock);this.$slides.eq(this.prevActiveSlide).animate({top:-this.orbitHeight},this.options.animationSpeed)}}this.setCaption()}}};b.fn.orbit=function(c){return this.each(function(){var d=b.extend({},a);d.init(this,c)})}})(jQuery); +/*! + * jQuery imageready Plugin + * http://www.zurb.com/playground/ + * + * Copyright 2011, ZURB + * Released under the MIT License + */ +(function(c){var b={};c.event.special.imageready={setup:function(f,e,d){b=f||b},add:function(d){var e=c(this),f;if(this.nodeType===1&&this.tagName.toLowerCase()==="img"&&this.src!==""){if(b.forceLoad){f=e.attr("src");e.attr("src","");a(this,d.handler);e.attr("src",f)}else{if(this.complete||this.readyState===4){d.handler.apply(this,arguments)}else{a(this,d.handler)}}}},teardown:function(d){c(this).unbind(".imageready")}};function a(d,f){var e=c(d);e.bind("load.imageready",function(){f.apply(d,arguments);e.unbind("load.imageready")})}}(jQuery));new function(a){a.fn.placeholder=function(b){b=b||{};var j=b.dataKey||"placeholderValue";var f=b.attr||"placeholder";var h=b.className||"placeholder";var k=b.values||[];var c=b.blockSubmit||false;var e=b.blankSubmit||false;var g=b.onSubmit||false;var i=b.value||"";var d=b.cursor_position||0;return this.filter(":input").each(function(l){a.data(this,j,k[l]||a(this).attr(f))}).each(function(){if(a.trim(a(this).val())===""){a(this).addClass(h).val(a.data(this,j))}}).focus(function(){if(a.trim(a(this).val())===a.data(this,j)){a(this).removeClass(h).val(i)}if(a.fn.setCursorPosition){a(this).setCursorPosition(d)}}).blur(function(){if(a.trim(a(this).val())===i){a(this).addClass(h).val(a.data(this,j))}}).each(function(l,m){if(c){new function(n){a(n.form).submit(function(){return a.trim(a(n).val())!=a.data(n,j)})}(m)}else{if(e){new function(n){a(n.form).submit(function(){if(a.trim(a(n).val())==a.data(n,j)){a(n).removeClass(h).val("")}return true})}(m)}else{if(g){new function(n){a(n.form).submit(g)}(m)}}}})}}(jQuery);jQuery(document).ready(function(b){function a(c){b("form.custom input:"+c).each(function(){var e=b(this).hide(),d=e.next("span.custom."+c);if(d.length===0){d=b('').insertAfter(e)}d.toggleClass("checked",e.is(":checked"))})}a("checkbox");a("radio");b("form.custom select").each(function(){var e=b(this),g=e.next("div.custom.dropdown"),c=e.find("option"),d=0,f;if(g.length===0){g=b('"');c.each(function(){f=b("
    • "+b(this).html()+"
    • ");g.find("ul").append(f)});g.prepend(''+c.first().html()+"");e.after(g);e.hide()}c.each(function(h){if(this.selected){g.find("li").eq(h).addClass("selected");g.find(".current").html(b(this).html())}});g.find("li").each(function(){g.addClass("open");if(b(this).outerWidth()>d){d=b(this).outerWidth()}g.removeClass("open")});g.css("width",d+18+"px");g.find("ul").css("width",d+16+"px")})});(function(b){function a(d){var f=d.prev(),e=f[0];e.checked=((e.checked)?false:true);d.toggleClass("checked");f.trigger("change")}function c(d){var f=d.prev(),e=f[0];b('input:radio[name="'+f.attr("name")+'"]').each(function(){b(this).next().removeClass("checked")});e.checked=((e.checked)?false:true);d.toggleClass("checked");f.trigger("change")}b(document).on("click","form.custom span.custom.checkbox",function(d){d.preventDefault();d.stopPropagation();a(b(this))});b(document).on("click","form.custom span.custom.radio",function(d){d.preventDefault();d.stopPropagation();c(b(this))});b(document).on("click","form.custom label",function(e){var d=b("#"+b(this).attr("for")),g,f;if(d.length!==0){if(d.attr("type")==="checkbox"){e.preventDefault();g=b(this).find("span.custom.checkbox");a(g)}else{if(d.attr("type")==="radio"){e.preventDefault();f=b(this).find("span.custom.radio");c(f)}}}});b(document).on("click","form.custom div.custom.dropdown a.current, form.custom div.custom.dropdown a.selector",function(d){var f=b(this),e=f.closest("div.custom.dropdown");d.preventDefault();e.toggleClass("open");if(e.hasClass("open")){b(document).bind("click.customdropdown",function(g){e.removeClass("open");b(document).unbind(".customdropdown")})}else{b(document).unbind(".customdropdown")}});b(document).on("click","form.custom div.custom.dropdown li",function(g){var h=b(this),e=h.closest("div.custom.dropdown"),f=e.prev(),d=0;g.preventDefault();g.stopPropagation();h.closest("ul").find("li").removeClass("selected");h.addClass("selected");e.removeClass("open").find("a.current").html(h.html());h.closest("ul").find("li").each(function(i){if(h[0]==this){d=i}});f[0].selectedIndex=d;f.trigger("change")})})(jQuery); +/*! http://mths.be/placeholder v1.8.5 by @mathias */ +(function(j,i,l){var k="placeholder" in i.createElement("input"),h="placeholder" in i.createElement("textarea");if(k&&h){l.fn.placeholder=function(){return this};l.fn.placeholder.input=l.fn.placeholder.textarea=true}else{l.fn.placeholder=function(){return this.filter((k?"textarea":":input")+"[placeholder]").bind("focus.placeholder",o).bind("blur.placeholder",m).trigger("blur.placeholder").end()};l.fn.placeholder.input=k;l.fn.placeholder.textarea=h;l(function(){l("form").bind("submit.placeholder",function(){var a=l(".placeholder",this).each(o);setTimeout(function(){a.each(m)},10)})});l(j).bind("unload.placeholder",function(){l(".placeholder").val("")})}function n(b){var c={},a=/^jQuery\d+$/;l.each(b.attributes,function(d,e){if(e.specified&&!a.test(e.name)){c[e.name]=e.value}});return c}function o(){var a=l(this);if(a.val()===a.attr("placeholder")&&a.hasClass("placeholder")){if(a.data("placeholder-password")){a.hide().next().show().focus().attr("id",a.removeAttr("id").data("placeholder-id"))}else{a.val("").removeClass("placeholder")}}}function m(){var a,b=l(this),e=b,c=this.id;if(b.val()===""){if(b.is(":password")){if(!b.data("placeholder-textinput")){try{a=b.clone().attr({type:"text"})}catch(d){a=l("").attr(l.extend(n(this),{type:"text"}))}a.removeAttr("name").data("placeholder-password",true).data("placeholder-id",c).bind("focus.placeholder",o);b.data("placeholder-textinput",a).data("placeholder-id",c).before(a)}b=b.removeAttr("id").hide().prev().attr("id",c).show()}b.addClass("placeholder").val(b.attr("placeholder"))}else{b.removeClass("placeholder")}}}(this,document,jQuery)); --- /dev/null +++ b/js/jquery-1.6.2.min.js @@ -1,1 +1,18 @@ - +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
      a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
      ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
      t
      ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
      ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); --- /dev/null +++ b/js/sigma.min.js @@ -1,1 +1,3552 @@ - +// Define packages: +var sigma = {}; +sigma.tools = {}; +sigma.classes = {}; +sigma.instances = {}; + +// Adding Array helpers, if not present yet: +(function() { + if (!Array.prototype.some) { + Array.prototype.some = function(fun /*, thisp*/) { + var len = this.length; + if (typeof fun != 'function') { + throw new TypeError(); + } + + var thisp = arguments[1]; + for (var i = 0; i < len; i++) { + if (i in this && + fun.call(thisp, this[i], i, this)) { + return true; + } + } + + return false; + }; + } + + if (!Array.prototype.forEach) { + Array.prototype.forEach = function(fun /*, thisp*/) { + var len = this.length; + if (typeof fun != 'function') { + throw new TypeError(); + } + + var thisp = arguments[1]; + for (var i = 0; i < len; i++) { + if (i in this) { + fun.call(thisp, this[i], i, this); + } + } + }; + } + + if (!Array.prototype.map) { + Array.prototype.map = function(fun /*, thisp*/) { + var len = this.length; + if (typeof fun != 'function') { + throw new TypeError(); + } + + var res = new Array(len); + var thisp = arguments[1]; + for (var i = 0; i < len; i++) { + if (i in this) { + res[i] = fun.call(thisp, this[i], i, this); + } + } + + return res; + }; + } + + if (!Array.prototype.filter) { + Array.prototype.filter = function(fun /*, thisp*/) { + var len = this.length; + if (typeof fun != 'function') + throw new TypeError(); + + var res = new Array(); + var thisp = arguments[1]; + for (var i = 0; i < len; i++) { + if (i in this) { + var val = this[i]; // in case fun mutates this + if (fun.call(thisp, val, i, this)) { + res.push(val); + } + } + } + + return res; + }; + } + + if (!Object.keys) { + Object.keys = (function() { + var hasOwnProperty = Object.prototype.hasOwnProperty, + hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), + dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ], + dontEnumsLength = dontEnums.length; + + return function(obj) { + if (typeof obj !== 'object' && + typeof obj !== 'function' || + obj === null + ) { + throw new TypeError('Object.keys called on non-object'); + } + + var result = []; + + for (var prop in obj) { + if (hasOwnProperty.call(obj, prop)) result.push(prop); + } + + if (hasDontEnumBug) { + for (var i = 0; i < dontEnumsLength; i++) { + if (hasOwnProperty.call(obj, dontEnums[i])) { + result.push(dontEnums[i]); + } + } + } + return result; + } + })(); + } +})(); + +/** + * A jQuery like properties management class. It works like jQuery .css() + * method: You can call it with juste one string to get the corresponding + * property, with a string and anything else to set the corresponding property, + * or directly with an object, and then each pair string / object (or any type) + * will be set in the properties. + * @constructor + * @this {sigma.classes.Cascade} + */ +sigma.classes.Cascade = function() { + /** + * This instance properties. + * @protected + * @type {Object} + */ + this.p = {}; + + /** + * The method to use to set/get any property of this instance. + * @param {(string|Object)} a1 If it is a string and if a2 is undefined, + * then it will return the corresponding + * property. + * If it is a string and if a2 is set, then it + * will set a2 as the property corresponding to + * a1, and return this. + * If it is an object, then each pair string / + * object (or any other type) will be set as a + * property. + * @param {*?} a2 The new property corresponding to a1 if a1 is + * a string. + * @return {(*|sigma.classes.Cascade)} Returns itself or the corresponding + * property. + */ + this.config = function(a1, a2) { + if (typeof a1 == 'string' && a2 == undefined) { + return this.p[a1]; + } else { + var o = (typeof a1 == 'object' && a2 == undefined) ? a1 : {}; + if (typeof a1 == 'string') { + o[a1] = a2; + } + + for (var k in o) { + if (this.p[k] != undefined) { + this.p[k] = o[k]; + } + } + return this; + } + }; +}; + +/** + * sigma.js custom event dispatcher class. + * @constructor + * @this {sigma.classes.EventDispatcher} + */ +sigma.classes.EventDispatcher = function() { + /** + * An object containing all the different handlers bound to one or many + * events, indexed by these events. + * @private + * @type {Object.} + */ + var _h = {}; + + /** + * Represents "this", without the well-known scope issue. + * @private + * @type {sigma.classes.EventDispatcher} + */ + var _self = this; + + /** + * Will execute the handler the next (and only the next) time that the + * indicated event (or the indicated events) will be triggered. + * @param {string} events The name of the event (or the events + * separated by spaces). + * @param {function(Object)} handler The handler to bind. + * @return {sigma.classes.EventDispatcher} Returns itself. + */ + function one(events, handler) { + if (!handler || !events) { + return _self; + } + + var eArray = ((typeof events) == 'string') ? events.split(' ') : events; + + eArray.forEach(function(event) { + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + 'h': handler, + 'one': true + }); + }); + + return _self; + } + + /** + * Will execute the handler everytime that the indicated event (or the + * indicated events) will be triggered. + * @param {string} events The name of the event (or the events + * separated by spaces). + * @param {function(Object)} handler The handler to bind. + * @return {sigma.classes.EventDispatcher} Returns itself. + */ + function bind(events, handler) { + if (!handler || !events) { + return _self; + } + + var eArray = ((typeof events) == 'string') ? events.split(' ') : events; + + eArray.forEach(function(event) { + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + 'h': handler, + 'one': false + }); + }); + + return _self; + } + + /** + * Unbinds the handler from a specified event (or specified events). + * @param {?string} events The name of the event (or the events + * separated by spaces). If undefined, + * then all handlers are unbound. + * @param {?function(Object)} handler The handler to unbind. If undefined, + * each handler bound to the event or the + * events will be unbound. + * @return {sigma.classes.EventDispatcher} Returns itself. + */ + function unbind(events, handler) { + if (!events) { + _h = {}; + } + + var eArray = typeof events == 'string' ? events.split(' ') : events; + + if (handler) { + eArray.forEach(function(event) { + if (_h[event]) { + _h[event] = _h[event].filter(function(e) { + return e['h'] != handler; + }); + } + + if (_h[event] && _h[event].length == 0) { + delete _h[event]; + } + }); + }else { + eArray.forEach(function(event) { + delete _h[event]; + }); + } + + return _self; + } + + /** + * Executes each handler bound to the event + * @param {string} type The type of the event. + * @param {?Object} content The content of the event (optional). + * @return {sigma.classes.EventDispatcher} Returns itself. + */ + function dispatch(type, content) { + if (_h[type]) { + _h[type].forEach(function(e) { + e['h']({ + 'type': type, + 'content': content, + 'target': _self + }); + }); + + _h[type] = _h[type].filter(function(e) { + return !e['one']; + }); + } + + return _self; + } + + /* PUBLIC INTERFACE: */ + this.one = one; + this.bind = bind; + this.unbind = unbind; + this.dispatch = dispatch; +}; + +(function() { +// Define local shortcut: +var id = 0; + +// Define local package: +var local = {}; +local.plugins = []; + +sigma.init = function(dom) { + var inst = new Sigma(dom, (++id).toString()); + sigma.instances[id] = new SigmaPublic(inst); + return sigma.instances[id]; +}; + +/** + * This class listen to all the different mouse events, to normalize them and + * dispatch action events instead (from "startinterpolate" to "isdragging", + * etc). + * @constructor + * @extends sigma.classes.Cascade + * @extends sigma.classes.EventDispatcher + * @param {element} dom The DOM element to bind the handlers on. + * @this {MouseCaptor} + */ +function MouseCaptor(dom) { + sigma.classes.Cascade.call(this); + sigma.classes.EventDispatcher.call(this); + + /** + * Represents "this", without the well-known scope issue. + * @private + * @type {MouseCaptor} + */ + var self = this; + + /** + * The DOM element to bind the handlers on. + * @type {element} + */ + var dom = dom; + + /** + * The different parameters that define how this instance should work. + * @see sigma.classes.Cascade + * @type {Object} + */ + this.p = { + minRatio: 1, + maxRatio: 32, + marginRatio: 1, + zoomDelta: 0.1, + dragDelta: 0.3, + zoomMultiply: 2, + directZooming: false, + blockScroll: true, + inertia: 1.1, + mouseEnabled: true + }; + + var oldMouseX = 0; + var oldMouseY = 0; + var startX = 0; + var startY = 0; + + var oldStageX = 0; + var oldStageY = 0; + var oldRatio = 1; + + var targetRatio = 1; + var targetStageX = 0; + var targetStageY = 0; + + var lastStageX = 0; + var lastStageX2 = 0; + var lastStageY = 0; + var lastStageY2 = 0; + + var progress = 0; + var isZooming = false; + + this.stageX = 0; + this.stageY = 0; + this.ratio = 1; + + this.mouseX = 0; + this.mouseY = 0; + + this.isMouseDown = false; + + /** + * Extract the local X position from a mouse event. + * @private + * @param {event} e A mouse event. + * @return {number} The local X value of the mouse. + */ + function getX(e) { + return e.offsetX != undefined && e.offsetX || + e.layerX != undefined && e.layerX || + e.clientX != undefined && e.clientX; + }; + + /** + * Extract the local Y position from a mouse event. + * @private + * @param {event} e A mouse event. + * @return {number} The local Y value of the mouse. + */ + function getY(e) { + return e.offsetY != undefined && e.offsetY || + e.layerY != undefined && e.layerY || + e.clientY != undefined && e.clientY; + }; + + /** + * Extract the wheel delta from a mouse event. + * @private + * @param {event} e A mouse event. + * @return {number} The wheel delta of the mouse. + */ + function getDelta(e) { + return e.wheelDelta != undefined && e.wheelDelta || + e.detail != undefined && -e.detail; + }; + + /** + * The handler listening to the 'move' mouse event. It will set the mouseX + * and mouseY values as the mouse position values, prevent the default event, + * and dispatch a 'move' event. + * @private + * @param {event} event A 'move' mouse event. + */ + function moveHandler(event) { + oldMouseX = self.mouseX; + oldMouseY = self.mouseY; + + self.mouseX = getX(event); + self.mouseY = getY(event); + + self.isMouseDown && drag(event); + self.dispatch('move'); + + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + }; + + /** + * The handler listening to the 'up' mouse event. It will set the isMouseDown + * value as false, dispatch a 'mouseup' event, and trigger stopDrag(). + * @private + * @param {event} event A 'up' mouse event. + */ + function upHandler(event) { + if (self.p.mouseEnabled && self.isMouseDown) { + self.isMouseDown = false; + self.dispatch('mouseup'); + stopDrag(); + + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + }; + + /** + * The handler listening to the 'down' mouse event. It will set the + * isMouseDown value as true, dispatch a 'mousedown' event, and trigger + * startDrag(). + * @private + * @param {event} event A 'down' mouse event. + */ + function downHandler(event) { + if (self.p.mouseEnabled) { + self.isMouseDown = true; + oldMouseX = self.mouseX; + oldMouseY = self.mouseY; + + self.dispatch('mousedown'); + + startDrag(); + + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + }; + + /** + * The handler listening to the 'wheel' mouse event. It will trigger + * {@link startInterpolate} with the event delta as parameter. + * @private + * @param {event} event A 'wheel' mouse event. + */ + function wheelHandler(event) { + if (self.p.mouseEnabled) { + startInterpolate( + self.mouseX, + self.mouseY, + self.ratio * (getDelta(event) > 0 ? + self.p.zoomMultiply : + 1 / self.p.zoomMultiply) + ); + + if (self.p['blockScroll']) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + } + }; + + /** + * Will start computing the scene X and Y, until {@link stopDrag} is + * triggered. + */ + function startDrag() { + oldStageX = self.stageX; + oldStageY = self.stageY; + startX = self.mouseX; + startY = self.mouseY; + + lastStageX = self.stageX; + lastStageX2 = self.stageX; + lastStageY = self.stageY; + lastStageY2 = self.stageY; + + self.dispatch('startdrag'); + }; + + /** + * Stops computing the scene position. + */ + function stopDrag() { + if (oldStageX != self.stageX || oldStageY != self.stageY) { + startInterpolate( + self.stageX + self.p.inertia * (self.stageX - lastStageX2), + self.stageY + self.p.inertia * (self.stageY - lastStageY2) + ); + } + }; + + /** + * Computes the position of the scene, relatively to the mouse position, and + * dispatches a "drag" event. + */ + function drag() { + var newStageX = self.mouseX - startX + oldStageX; + var newStageY = self.mouseY - startY + oldStageY; + + if (newStageX != self.stageX || newStageY != self.stageY) { + lastStageX2 = lastStageX; + lastStageY2 = lastStageY; + + lastStageX = newStageX; + lastStageY = newStageY; + + self.stageX = newStageX; + self.stageY = newStageY; + self.dispatch('drag'); + } + }; + + /** + * Will start computing the scene zoom ratio, until {@link stopInterpolate} is + * triggered. + * @param {number} x The new stage X. + * @param {number} y The new stage Y. + * @param {number} ratio The new zoom ratio. + */ + function startInterpolate(x, y, ratio) { + if (self.isMouseDown) { + return; + } + + window.clearInterval(self.interpolationID); + isZooming = ratio != undefined; + + oldStageX = self.stageX; + targetStageX = x; + + oldStageY = self.stageY; + targetStageY = y; + + oldRatio = self.ratio; + targetRatio = ratio || self.ratio; + targetRatio = Math.min( + Math.max(targetRatio, self.p.minRatio), + self.p.maxRatio + ); + + progress = + self.p.directZooming ? + 1 - (isZooming ? self.p.zoomDelta : self.p.dragDelta) : + 0; + + if ( + self.ratio != targetRatio || + self.stageX != targetStageX || + self.stageY != targetStageY + ) { + interpolate(); + self.interpolationID = window.setInterval(interpolate, 50); + self.dispatch('startinterpolate'); + } + }; + + /** + * Stops the move interpolation. + */ + function stopInterpolate() { + var oldRatio = self.ratio; + + if (isZooming) { + self.ratio = targetRatio; + self.stageX = targetStageX + + (self.stageX - targetStageX) * + self.ratio / + oldRatio; + self.stageY = targetStageY + + (self.stageY - targetStageY) * + self.ratio / + oldRatio; + }else { + self.stageX = targetStageX; + self.stageY = targetStageY; + } + + self.dispatch('stopinterpolate'); + }; + + /** + * Computes the interpolate ratio and the position of the scene, relatively + * to the last mouse event delta received, and dispatches a "interpolate" + * event. + */ + function interpolate() { + progress += (isZooming ? self.p.zoomDelta : self.p.dragDelta); + progress = Math.min(progress, 1); + + var k = sigma.easing.quadratic.easeout(progress); + var oldRatio = self.ratio; + + self.ratio = oldRatio * (1 - k) + targetRatio * k; + + if (isZooming) { + self.stageX = targetStageX + + (self.stageX - targetStageX) * + self.ratio / + oldRatio; + + self.stageY = targetStageY + + (self.stageY - targetStageY) * + self.ratio / + oldRatio; + } else { + self.stageX = oldStageX * (1 - k) + targetStageX * k; + self.stageY = oldStageY * (1 - k) + targetStageY * k; + } + + self.dispatch('interpolate'); + if (progress >= 1) { + window.clearInterval(self.interpolationID); + stopInterpolate(); + } + }; + + /** + * Checks that there is always a part of the graph that is displayed, to + * avoid the user to drag the graph out of the stage. + * @param {Object} b An object containing the borders of the graph. + * @param {number} width The width of the stage. + * @param {number} height The height of the stage. + * @return {MouseCaptor} Returns itself. + */ + function checkBorders(b, width, height) { + // TODO : Find the good formula + /*if (!isNaN(b.minX) && !isNaN(b.maxX)) { + self.stageX = Math.min( + self.stageX = Math.max( + self.stageX, + (b.minX - width) * self.ratio + + self.p.marginRatio*(b.maxX - b.minX) + ), + (b.maxX - width) * self.ratio + + width - + self.p.marginRatio*(b.maxX - b.minX) + ); + } + + if (!isNaN(b.minY) && !isNaN(b.maxY)) { + self.stageY = Math.min( + self.stageY = Math.max( + self.stageY, + (b.minY - height) * self.ratio + + self.p.marginRatio*(b.maxY - b.minY) + ), + (b.maxY - height) * self.ratio + + height - + self.p.marginRatio*(b.maxY - b.minY) + ); + }*/ + + return self; + }; + + // ADD CALLBACKS + dom.addEventListener('DOMMouseScroll', wheelHandler, true); + dom.addEventListener('mousewheel', wheelHandler, true); + dom.addEventListener('mousemove', moveHandler, true); + dom.addEventListener('mousedown', downHandler, true); + document.addEventListener('mouseup', upHandler, true); + + this.checkBorders = checkBorders; + this.interpolate = startInterpolate; +} + +/** + * A class to monitor some local / global probes directly on an instance, + * inside a div DOM element. + * It executes different methods (called "probes") regularly, and displays + * the results on the element. + * @constructor + * @extends sigma.classes.Cascade + * @param {Sigma} instance The instance to monitor. + * @param {element} dom The div DOM element to draw write on. + * @this {Monitor} + */ +function Monitor(instance, dom) { + sigma.classes.Cascade.call(this); + + /** + * Represents "this", without the well-known scope issue. + * @private + * @type {Monitor} + */ + var self = this; + + /** + * {@link Sigma} instance owning this Monitor instance. + * @type {Sigma} + */ + this.instance = instance; + + /** + * Determines if the monitoring is activated or not. + * @type {Boolean} + */ + this.monitoring = false; + + /** + * The different parameters that define how this instance should work. It + * also contains the different probes. + * @see sigma.classes.Cascade + * @type {Object} + */ + this.p = { + fps: 40, + dom: dom, + globalProbes: { + 'Time (ms)': sigma.chronos.getExecutionTime, + 'Queue': sigma.chronos.getQueuedTasksCount, + 'Tasks': sigma.chronos.getTasksCount, + 'FPS': sigma.chronos.getFPS + }, + localProbes: { + 'Nodes count': function() { return self.instance.graph.nodes.length; }, + 'Edges count': function() { return self.instance.graph.edges.length; } + } + }; + + /** + * Activates the monitoring: Some texts describing some values about sigma.js + * or the owning {@link Sigma} instance will appear over the graph, but + * beneath the mouse sensible DOM element. + * @return {Monitor} Returns itself. + */ + function activate() { + if (!self.monitoring) { + self.monitoring = window.setInterval(routine, 1000 / self.p.fps); + } + + return self; + } + + /** + * Desactivates the monitoring: Will disappear, and stop computing the + * different probes. + * @return {Monitor} Returns itself. + */ + function desactivate() { + if (self.monitoring) { + window.clearInterval(self.monitoring); + self.monitoring = null; + + self.p.dom.innerHTML = ''; + } + + return self; + } + + /** + * The private method dedicated to compute the different values to observe. + * @private + * @return {Monitor} Returns itself. + */ + function routine() { + var s = ''; + + s += '

      GLOBAL :

      '; + for (var k in self.p.globalProbes) { + s += '

      ' + k + ' : ' + self.p.globalProbes[k]() + '

      '; + } + + s += '

      LOCAL :

      '; + for (var k in self.p.localProbes) { + s += '

      ' + k + ' : ' + self.p.localProbes[k]() + '

      '; + } + + self.p.dom.innerHTML = s; + + return self; + } + + this.activate = activate; + this.desactivate = desactivate; +} + +/** + * Sigma is the main class. It represents the core of any instance id sigma.js. + * It is private and can be initialized only from inside sigma.js. To see its + * public interface, see {@link SigmaPublic}. + * It owns its own {@link Graph}, {@link MouseCaptor}, {@link Plotter} + * and {@link Monitor}. + * @constructor + * @extends sigma.classes.Cascade + * @extends sigma.classes.EventDispatcher + * @param {element} root The DOM root of this instance (a div, for example). + * @param {string} id The ID of this instance. + * @this {Sigma} + */ +function Sigma(root, id) { + sigma.classes.Cascade.call(this); + sigma.classes.EventDispatcher.call(this); + + /** + * Represents "this", without the well-known scope issue. + * @private + * @type {Sigma} + */ + var self = this; + + /** + * The ID of the instance. + * @type {string} + */ + this.id = id.toString(); + + /** + * The different parameters that define how this instance should work. + * @see sigma.classes.Cascade + * @type {Object} + */ + this.p = { + auto: true, + drawNodes: 2, + drawEdges: 1, + drawLabels: 2, + lastNodes: 2, + lastEdges: 0, + lastLabels: 2, + drawHoverNodes: true, + drawActiveNodes: true + }; + + /** + * The root DOM element of this instance, containing every other elements. + * @type {element} + */ + this.domRoot = root; + + /** + * The width of this instance - initially, the root's width. + * @type {number} + */ + this.width = this.domRoot.offsetWidth; + + /** + * The height of this instance - initially, the root's height. + * @type {number} + */ + this.height = this.domRoot.offsetHeight; + + /** + * The graph of this instance - initiallyempty. + * @type {Graph} + */ + this.graph = new Graph(); + + /** + * An object referencing every DOM elements used by this instance. + * @type {Object} + */ + this.domElements = {}; + + initDOM('edges', 'canvas'); + initDOM('nodes', 'canvas'); + initDOM('labels', 'canvas'); + initDOM('hover', 'canvas'); + initDOM('monitor', 'div'); + initDOM('mouse', 'canvas'); + + /** + * The class dedicated to manage the drawing process of the graph of the + * different canvas. + * @type {Plotter} + */ + this.plotter = new Plotter( + this.domElements.nodes.getContext('2d'), + this.domElements.edges.getContext('2d'), + this.domElements.labels.getContext('2d'), + this.domElements.hover.getContext('2d'), + this.graph, + this.width, + this.height + ); + + /** + * The class dedicated to monitor different probes about the running + * processes or the data, such as the number of nodes or edges, or how + * many times the graph is drawn per second. + * @type {Monitor} + */ + this.monitor = new Monitor( + this, + this.domElements.monitor + ); + + /** + * The class dedicated to manage the different mouse events. + * @type {MouseCaptor} + */ + this.mousecaptor = new MouseCaptor( + this.domElements.mouse, + this.id + ); + + // Interaction listeners: + this.mousecaptor.bind('drag interpolate', function(e) { + self.draw( + self.p.auto ? 2 : self.p.drawNodes, + self.p.auto ? 0 : self.p.drawEdges, + self.p.auto ? 2 : self.p.drawLabels, + true + ); + }).bind('stopdrag stopinterpolate', function(e) { + self.draw( + self.p.auto ? 2 : self.p.drawNodes, + self.p.auto ? 1 : self.p.drawEdges, + self.p.auto ? 2 : self.p.drawLabels, + true + ); + }).bind('mousedown mouseup', function(e) { + var targeted = self.graph.nodes.filter(function(n) { + return !!n['hover']; + }).map(function(n) { + return n.id; + }); + + self.dispatch( + e['type'] == 'mousedown' ? + 'downgraph' : + 'upgraph' + ); + + if (targeted.length) { + self.dispatch( + e['type'] == 'mousedown' ? + 'downnodes' : + 'upnodes', + targeted + ); + } + }).bind('move', function() { + self.domElements.hover.getContext('2d').clearRect( + 0, + 0, + self.domElements.hover.width, + self.domElements.hover.height + ); + + drawHover(); + drawActive(); + }); + + sigma.chronos.bind('startgenerators', function() { + if (sigma.chronos.getGeneratorsIDs().some(function(id) { + return !!id.match(new RegExp('_ext_' + self.id + '$', '')); + })) { + self.draw( + self.p.auto ? 2 : self.p.drawNodes, + self.p.auto ? 0 : self.p.drawEdges, + self.p.auto ? 2 : self.p.drawLabels + ); + } + }).bind('stopgenerators', function() { + self.draw(); + }); + + /** + * Resizes the element, and redraws the graph with the last settings. + * @param {?number} w The new width (if undefined, it will use the root + * width). + * @param {?number} h The new height (if undefined, it will use the root + * height). + * @return {Sigma} Returns itself. + */ + function resize(w, h) { + var oldW = self.width, oldH = self.height; + + if (w != undefined && h != undefined) { + self.width = w; + self.height = h; + }else { + self.width = self.domRoot.offsetWidth; + self.height = self.domRoot.offsetHeight; + } + + if (oldW != self.width || oldH != self.height) { + for (var k in self.domElements) { + self.domElements[k].setAttribute('width', self.width + 'px'); + self.domElements[k].setAttribute('height', self.height + 'px'); + } + + self.plotter.resize(self.width, self.height); + + self.draw( + self.p.lastNodes, + self.p.lastEdges, + self.p.lastLabels, + true + ); + } + return self; + }; + + /** + * Kills every drawing task currently running. Basically, it stops this + * instance's drawing process. + * @return {Sigma} Returns itself. + */ + function clearSchedule() { + sigma.chronos.removeTask( + 'node_' + self.id, 2 + ).removeTask( + 'edge_' + self.id, 2 + ).removeTask( + 'label_' + self.id, 2 + ).stopTasks(); + return self; + }; + + /** + * Initialize a DOM element, that will be stores by this instance, to make + * automatic these elements resizing. + * @private + * @param {string} id The element's ID. + * @param {string} type The element's nodeName (Example : canvas, div, ...). + * @return {Sigma} Returns itself. + */ + function initDOM(id, type) { + self.domElements[id] = document.createElement(type); + self.domElements[id].style.position = 'absolute'; + self.domElements[id].setAttribute('id', 'sigma_' + id + '_' + self.id); + self.domElements[id].setAttribute('class', 'sigma_' + id + '_' + type); + self.domElements[id].setAttribute('width', self.width + 'px'); + self.domElements[id].setAttribute('height', self.height + 'px'); + + self.domRoot.appendChild(self.domElements[id]); + return self; + }; + + /** + * Starts the graph drawing process. The three first parameters indicate + * how the different layers have to be drawn: + * . -1: The layer is not drawn, but it is not erased. + * . 0: The layer is not drawn. + * . 1: The layer is drawn progressively. + * . 2: The layer is drawn directly. + * @param {?number} nodes Determines if and how the nodes must be drawn. + * @param {?number} edges Determines if and how the edges must be drawn. + * @param {?number} labels Determines if and how the labels must be drawn. + * @param {?boolean} safe If true, nothing will happen if any generator + * affiliated to this instance is currently running + * (an iterative layout, for example). + * @return {Sigma} Returns itself. + */ + function draw(nodes, edges, labels, safe) { + if (safe && sigma.chronos.getGeneratorsIDs().some(function(id) { + return !!id.match(new RegExp('_ext_' + self.id + '$', '')); + })) { + return self; + } + + var n = (nodes == undefined) ? self.p.drawNodes : nodes; + var e = (edges == undefined) ? self.p.drawEdges : edges; + var l = (labels == undefined) ? self.p.drawLabels : labels; + + var params = { + nodes: n, + edges: e, + labels: l + }; + + self.p.lastNodes = n; + self.p.lastEdges = e; + self.p.lastLabels = l; + + // Remove tasks: + clearSchedule(); + + // Rescale graph: + self.graph.rescale( + self.width, + self.height, + n > 0, + e > 0 + ).setBorders(); + + self.mousecaptor.checkBorders( + self.graph.borders, + self.width, + self.height + ); + + self.graph.translate( + self.mousecaptor.stageX, + self.mousecaptor.stageY, + self.mousecaptor.ratio, + n > 0, + e > 0 + ); + + self.dispatch( + 'graphscaled' + ); + + // Clear scene: + for (var k in self.domElements) { + if ( + self.domElements[k].nodeName.toLowerCase() == 'canvas' && + (params[k] == undefined || params[k] >= 0) + ) { + self.domElements[k].getContext('2d').clearRect( + 0, + 0, + self.domElements[k].width, + self.domElements[k].height + ); + } + } + + self.plotter.currentEdgeIndex = 0; + self.plotter.currentNodeIndex = 0; + self.plotter.currentLabelIndex = 0; + + var previous = null; + var start = false; + + if (n) { + if (n > 1) { + while (self.plotter.task_drawNode()) {} + }else { + sigma.chronos.addTask( + self.plotter.task_drawNode, + 'node_' + self.id, + false + ); + + start = true; + previous = 'node_' + self.id; + } + } + + if (l) { + if (l > 1) { + while (self.plotter.task_drawLabel()) {} + } else { + if (previous) { + sigma.chronos.queueTask( + self.plotter.task_drawLabel, + 'label_' + self.id, + previous + ); + } else { + sigma.chronos.addTask( + self.plotter.task_drawLabel, + 'label_' + self.id, + false + ); + } + + start = true; + previous = 'label_' + self.id; + } + } + + if (e) { + if (e > 1) { + while (self.plotter.task_drawEdge()) {} + }else { + if (previous) { + sigma.chronos.queueTask( + self.plotter.task_drawEdge, + 'edge_' + self.id, + previous + ); + }else { + sigma.chronos.addTask( + self.plotter.task_drawEdge, + 'edge_' + self.id, + false + ); + } + + start = true; + previous = 'edge_' + self.id; + } + } + + self.dispatch( + 'draw' + ); + + self.refresh(); + + start && sigma.chronos.runTasks(); + return self; + }; + + /** + * Draws the hover and active nodes labels. + * @return {Sigma} Returns itself. + */ + function refresh() { + self.domElements.hover.getContext('2d').clearRect( + 0, + 0, + self.domElements.hover.width, + self.domElements.hover.height + ); + + drawHover(); + drawActive(); + + return self; + } + + /** + * Draws the hover nodes labels. This method is applied directly, and does + * not use the pseudo-asynchronous tasks process. + * @return {Sigma} Returns itself. + */ + function drawHover() { + if (self.p.drawHoverNodes) { + self.graph.checkHover( + self.mousecaptor.mouseX, + self.mousecaptor.mouseY + ); + + self.graph.nodes.forEach(function(node) { + if (node.hover && !node.active) { + self.plotter.drawHoverNode(node); + } + }); + } + + return self; + } + + /** + * Draws the active nodes labels. This method is applied directly, and does + * not use the pseudo-asynchronous tasks process. + * @return {Sigma} Returns itself. + */ + function drawActive() { + if (self.p.drawActiveNodes) { + self.graph.nodes.forEach(function(node) { + if (node.active) { + self.plotter.drawActiveNode(node); + } + }); + } + + return self; + } + + // Apply plugins: + for (var i = 0; i < local.plugins.length; i++) { + local.plugins[i](this); + } + + this.draw = draw; + this.resize = resize; + this.refresh = refresh; + this.drawHover = drawHover; + this.drawActive = drawActive; + this.clearSchedule = clearSchedule; + + window.addEventListener('resize', function() { + self.resize(); + }); +} + +/** + * This class draws the graph on the different canvas DOM elements. It just + * contains all the different methods to draw the graph, synchronously or + * pseudo-asynchronously. + * @constructor + * @param {CanvasRenderingContext2D} nodesCtx Context dedicated to draw nodes. + * @param {CanvasRenderingContext2D} edgesCtx Context dedicated to draw edges. + * @param {CanvasRenderingContext2D} labelsCtx Context dedicated to draw + * labels. + * @param {CanvasRenderingContext2D} hoverCtx Context dedicated to draw hover + * nodes labels. + * @param {Graph} graph A reference to the graph to + * draw. + * @param {number} w The width of the DOM root + * element. + * @param {number} h The width of the DOM root + * element. + * @extends sigma.classes.Cascade + * @this {Plotter} + */ +function Plotter(nodesCtx, edgesCtx, labelsCtx, hoverCtx, graph, w, h) { + sigma.classes.Cascade.call(this); + + /** + * Represents "this", without the well-known scope issue. + * @private + * @type {Plotter} + */ + var self = this; + + /** + * The different parameters that define how this instance should work. + * @see sigma.classes.Cascade + * @type {Object} + */ + this.p = { + // ------- + // LABELS: + // ------- + // Label color: + // - 'node' + // - default (then defaultLabelColor + // will be used instead) + labelColor: 'default', + defaultLabelColor: '#000', + // Label hover background color: + // - 'node' + // - default (then defaultHoverLabelBGColor + // will be used instead) + labelHoverBGColor: 'default', + defaultHoverLabelBGColor: '#fff', + // Label hover shadow: + labelHoverShadow: true, + labelHoverShadowColor: '#000', + // Label hover color: + // - 'node' + // - default (then defaultLabelHoverColor + // will be used instead) + labelHoverColor: 'default', + defaultLabelHoverColor: '#000', + // Label active background color: + // - 'node' + // - default (then defaultActiveLabelBGColor + // will be used instead) + labelActiveBGColor: 'default', + defaultActiveLabelBGColor: '#fff', + // Label active shadow: + labelActiveShadow: true, + labelActiveShadowColor: '#000', + // Label active color: + // - 'node' + // - default (then defaultLabelActiveColor + // will be used instead) + labelActiveColor: 'default', + defaultLabelActiveColor: '#000', + // Label size: + // - 'fixed' + // - 'proportional' + // Label size: + // - 'fixed' + // - 'proportional' + labelSize: 'fixed', + defaultLabelSize: 12, // for fixed display only + labelSizeRatio: 2, // for proportional display only + labelThreshold: 6, + font: 'Arial', + hoverFont: '', + activeFont: '', + fontStyle: '', + hoverFontStyle: '', + activeFontStyle: '', + // ------ + // EDGES: + // ------ + // Edge color: + // - 'source' + // - 'target' + // - default (then defaultEdgeColor or edge['color'] + // will be used instead) + edgeColor: 'source', + defaultEdgeColor: '#aaa', + defaultEdgeType: 'line', + // ------ + // NODES: + // ------ + defaultNodeColor: '#aaa', + // HOVER: + // Node hover color: + // - 'node' + // - default (then defaultNodeHoverColor + // will be used instead) + nodeHoverColor: 'node', + defaultNodeHoverColor: '#fff', + // ACTIVE: + // Node active color: + // - 'node' + // - default (then defaultNodeActiveColor + // will be used instead) + nodeActiveColor: 'node', + defaultNodeActiveColor: '#fff', + // Node border color: + // - 'node' + // - default (then defaultNodeBorderColor + // will be used instead) + borderSize: 0, + nodeBorderColor: 'node', + defaultNodeBorderColor: '#fff', + // -------- + // PROCESS: + // -------- + edgesSpeed: 200, + nodesSpeed: 200, + labelsSpeed: 200 + }; + + /** + * The canvas context dedicated to draw the nodes. + * @type {CanvasRenderingContext2D} + */ + var nodesCtx = nodesCtx; + + /** + * The canvas context dedicated to draw the edges. + * @type {CanvasRenderingContext2D} + */ + var edgesCtx = edgesCtx; + + /** + * The canvas context dedicated to draw the labels. + * @type {CanvasRenderingContext2D} + */ + var labelsCtx = labelsCtx; + + /** + * The canvas context dedicated to draw the hover nodes. + * @type {CanvasRenderingContext2D} + */ + var hoverCtx = hoverCtx; + + /** + * A reference to the graph to draw. + * @type {Graph} + */ + var graph = graph; + + /** + * The width of the stage to draw on. + * @type {number} + */ + var width = w; + + /** + * The height of the stage to draw on. + * @type {number} + */ + var height = h; + + /** + * The index of the next edge to draw. + * @type {number} + */ + this.currentEdgeIndex = 0; + + /** + * The index of the next node to draw. + * @type {number} + */ + this.currentNodeIndex = 0; + + /** + * The index of the next label to draw. + * @type {number} + */ + this.currentLabelIndex = 0; + + /** + * An atomic function to drawn the N next edges, with N as edgesSpeed. + * The counter is {@link this.currentEdgeIndex}. + * This function has been designed to work with {@link sigma.chronos}, that + * will insert frames at the middle of the calls, to make the edges drawing + * process fluid for the user. + * @see sigma.chronos + * @return {boolean} Returns true if all the edges are drawn and false else. + */ + function task_drawEdge() { + var c = graph.edges.length; + var s, t, i = 0; + + while (i++< self.p.edgesSpeed && self.currentEdgeIndex < c) { + e = graph.edges[self.currentEdgeIndex]; + s = e['source']; + t = e['target']; + if (e['hidden'] || + s['hidden'] || + t['hidden'] || + (!self.isOnScreen(s) && !self.isOnScreen(t))) { + self.currentEdgeIndex++; + }else { + drawEdge(graph.edges[self.currentEdgeIndex++]); + } + } + + return self.currentEdgeIndex < c; + }; + + /** + * An atomic function to drawn the N next nodes, with N as nodesSpeed. + * The counter is {@link this.currentEdgeIndex}. + * This function has been designed to work with {@link sigma.chronos}, that + * will insert frames at the middle of the calls, to make the nodes drawing + * process fluid for the user. + * @see sigma.chronos + * @return {boolean} Returns true if all the nodes are drawn and false else. + */ + function task_drawNode() { + var c = graph.nodes.length; + var i = 0; + + while (i++< self.p.nodesSpeed && self.currentNodeIndex < c) { + if (!self.isOnScreen(graph.nodes[self.currentNodeIndex])) { + self.currentNodeIndex++; + }else { + drawNode(graph.nodes[self.currentNodeIndex++]); + } + } + + return self.currentNodeIndex < c; + }; + + /** + * An atomic function to drawn the N next labels, with N as labelsSpeed. + * The counter is {@link this.currentEdgeIndex}. + * This function has been designed to work with {@link sigma.chronos}, that + * will insert frames at the middle of the calls, to make the labels drawing + * process fluid for the user. + * @see sigma.chronos + * @return {boolean} Returns true if all the labels are drawn and false else. + */ + function task_drawLabel() { + var c = graph.nodes.length; + var i = 0; + + while (i++< self.p.labelsSpeed && self.currentLabelIndex < c) { + if (!self.isOnScreen(graph.nodes[self.currentLabelIndex])) { + self.currentLabelIndex++; + }else { + drawLabel(graph.nodes[self.currentLabelIndex++]); + } + } + + return self.currentLabelIndex < c; + }; + + /** + * Draws one node to the corresponding canvas. + * @param {Object} node The node to draw. + * @return {Plotter} Returns itself. + */ + function drawNode(node) { + var size = Math.round(node['displaySize'] * 10) / 10; + var ctx = nodesCtx; + + ctx.fillStyle = node['color']; + ctx.beginPath(); + ctx.arc(node['displayX'], + node['displayY'], + size, + 0, + Math.PI * 2, + true); + + ctx.closePath(); + ctx.fill(); + + node['hover'] && drawHoverNode(node); + return self; + }; + + /** + * Draws one edge to the corresponding canvas. + * @param {Object} edge The edge to draw. + * @return {Plotter} Returns itself. + */ + function drawEdge(edge) { + var x1 = edge['source']['displayX']; + var y1 = edge['source']['displayY']; + var x2 = edge['target']['displayX']; + var y2 = edge['target']['displayY']; + var color = edge['color']; + + if (!color) { + switch (self.p.edgeColor) { + case 'source': + color = edge['source']['color'] || + self.p.defaultNodeColor; + break; + case 'target': + color = edge['target']['color'] || + self.p.defaultNodeColor; + break; + default: + color = self.p.defaultEdgeColor; + break; + } + } + + var ctx = edgesCtx; + + switch (edge['type'] || self.p.defaultEdgeType) { + case 'curve': + ctx.strokeStyle = color; + ctx.lineWidth = edge['displaySize'] / 3; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.quadraticCurveTo((x1 + x2) / 2 + (y2 - y1) / 4, + (y1 + y2) / 2 + (x1 - x2) / 4, + x2, + y2); + ctx.stroke(); + break; + case 'line': + default: + ctx.strokeStyle = color; + ctx.lineWidth = edge['displaySize'] / 3; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + + ctx.stroke(); + break; + } + + return self; + }; + + /** + * Draws one label to the corresponding canvas. + * @param {Object} node The label to draw. + * @return {Plotter} Returns itself. + */ + function drawLabel(node) { + var ctx = labelsCtx; + + if (node['displaySize'] >= self.p.labelThreshold || node['forceLabel']) { + var fontSize = self.p.labelSize == 'fixed' ? + self.p.defaultLabelSize : + self.p.labelSizeRatio * node['displaySize']; + + ctx.font = self.p.fontStyle + fontSize + 'px ' + self.p.font; + + ctx.fillStyle = self.p.labelColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultLabelColor; + ctx.fillText( + node['label'], + Math.round(node['displayX'] + node['displaySize'] * 1.5), + Math.round(node['displayY'] + fontSize / 2 - 3) + ); + } + + return self; + }; + + /** + * Draws one hover node to the corresponding canvas. + * @param {Object} node The hover node to draw. + * @return {Plotter} Returns itself. + */ + function drawHoverNode(node) { + var ctx = hoverCtx; + + var fontSize = self.p.labelSize == 'fixed' ? + self.p.defaultLabelSize : + self.p.labelSizeRatio * node['displaySize']; + + ctx.font = (self.p.hoverFontStyle || self.p.fontStyle || '') + ' ' + + fontSize + 'px ' + + (self.p.hoverFont || self.p.font || ''); + + ctx.fillStyle = self.p.labelHoverBGColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultHoverLabelBGColor; + + // Label background: + ctx.beginPath(); + + if (self.p.labelHoverShadow) { + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 4; + ctx.shadowColor = self.p.labelHoverShadowColor; + } + + sigma.tools.drawRoundRect( + ctx, + Math.round(node['displayX'] - fontSize / 2 - 2), + Math.round(node['displayY'] - fontSize / 2 - 2), + Math.round(ctx.measureText(node['label']).width + + node['displaySize'] * 1.5 + + fontSize / 2 + 4), + Math.round(fontSize + 4), + Math.round(fontSize / 2 + 2), + 'left' + ); + ctx.closePath(); + ctx.fill(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // Node border: + ctx.beginPath(); + ctx.fillStyle = self.p.nodeBorderColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultNodeBorderColor; + ctx.arc(Math.round(node['displayX']), + Math.round(node['displayY']), + node['displaySize'] + self.p.borderSize, + 0, + Math.PI * 2, + true); + ctx.closePath(); + ctx.fill(); + + // Node: + ctx.beginPath(); + ctx.fillStyle = self.p.nodeHoverColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultNodeHoverColor; + ctx.arc(Math.round(node['displayX']), + Math.round(node['displayY']), + node['displaySize'], + 0, + Math.PI * 2, + true); + + ctx.closePath(); + ctx.fill(); + + // Label: + ctx.fillStyle = self.p.labelHoverColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultLabelHoverColor; + ctx.fillText( + node['label'], + Math.round(node['displayX'] + node['displaySize'] * 1.5), + Math.round(node['displayY'] + fontSize / 2 - 3) + ); + + return self; + }; + + /** + * Draws one active node to the corresponding canvas. + * @param {Object} node The active node to draw. + * @return {Plotter} Returns itself. + */ + function drawActiveNode(node) { + var ctx = hoverCtx; + + if (!isOnScreen(node)) { + return self; + } + + var fontSize = self.p.labelSize == 'fixed' ? + self.p.defaultLabelSize : + self.p.labelSizeRatio * node['displaySize']; + + ctx.font = (self.p.activeFontStyle || self.p.fontStyle || '') + ' ' + + fontSize + 'px ' + + (self.p.activeFont || self.p.font || ''); + + ctx.fillStyle = self.p.labelHoverBGColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultActiveLabelBGColor; + + // Label background: + ctx.beginPath(); + + if (self.p.labelActiveShadow) { + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 4; + ctx.shadowColor = self.p.labelActiveShadowColor; + } + + sigma.tools.drawRoundRect( + ctx, + Math.round(node['displayX'] - fontSize / 2 - 2), + Math.round(node['displayY'] - fontSize / 2 - 2), + Math.round(ctx.measureText(node['label']).width + + node['displaySize'] * 1.5 + + fontSize / 2 + 4), + Math.round(fontSize + 4), + Math.round(fontSize / 2 + 2), + 'left' + ); + ctx.closePath(); + ctx.fill(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // Node border: + ctx.beginPath(); + ctx.fillStyle = self.p.nodeBorderColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultNodeBorderColor; + ctx.arc(Math.round(node['displayX']), + Math.round(node['displayY']), + node['displaySize'] + self.p.borderSize, + 0, + Math.PI * 2, + true); + ctx.closePath(); + ctx.fill(); + + // Node: + ctx.beginPath(); + ctx.fillStyle = self.p.nodeActiveColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultNodeActiveColor; + ctx.arc(Math.round(node['displayX']), + Math.round(node['displayY']), + node['displaySize'], + 0, + Math.PI * 2, + true); + + ctx.closePath(); + ctx.fill(); + + // Label: + ctx.fillStyle = self.p.labelActiveColor == 'node' ? + (node['color'] || self.p.defaultNodeColor) : + self.p.defaultLabelActiveColor; + ctx.fillText( + node['label'], + Math.round(node['displayX'] + node['displaySize'] * 1.5), + Math.round(node['displayY'] + fontSize / 2 - 3) + ); + + return self; + }; + + /** + * Determines if a node is on the screen or not. The limits here are + * bigger than the actual screen, to avoid seeing labels disappear during + * the graph manipulation. + * @param {Object} node The node to check if it is on or out the screen. + * @return {boolean} Returns false if the node is hidden or not on the screen + * or true else. + */ + function isOnScreen(node) { + if (isNaN(node['x']) || isNaN(node['y'])) { + throw (new Error('A node\'s coordinate is not a ' + + 'number (id: ' + node['id'] + ')') + ); + } + + return !node['hidden'] && + (node['displayX'] + node['displaySize'] > -width / 3) && + (node['displayX'] - node['displaySize'] < width * 4 / 3) && + (node['displayY'] + node['displaySize'] > -height / 3) && + (node['displayY'] - node['displaySize'] < height * 4 / 3); + }; + + /** + * Resizes this instance. + * @param {number} w The new width. + * @param {number} h The new height. + * @return {Plotter} Returns itself. + */ + function resize(w, h) { + width = w; + height = h; + + return self; + } + + this.task_drawLabel = task_drawLabel; + this.task_drawEdge = task_drawEdge; + this.task_drawNode = task_drawNode; + this.drawActiveNode = drawActiveNode; + this.drawHoverNode = drawHoverNode; + this.isOnScreen = isOnScreen; + this.resize = resize; +} + +function SigmaPublic(sigmaInstance) { + var s = sigmaInstance; + var self = this; + sigma.classes.EventDispatcher.call(this); + + this._core = sigmaInstance; + + this.kill = function() { + // TODO + }; + + this.getID = function() { + return s.id; + }; + + // Config: + this.configProperties = function(a1, a2) { + var res = s.config(a1, a2); + return res == s ? self : res; + }; + + this.drawingProperties = function(a1, a2) { + var res = s.plotter.config(a1, a2); + return res == s.plotter ? self : res; + }; + + this.mouseProperties = function(a1, a2) { + var res = s.mousecaptor.config(a1, a2); + return res == s.mousecaptor ? self : res; + }; + + this.graphProperties = function(a1, a2) { + var res = s.graph.config(a1, a2); + return res == s.graph ? self : res; + }; + + this.getMouse = function() { + return { + mouseX: s.mousecaptor.mouseX, + mouseY: s.mousecaptor.mouseY, + down: s.mousecaptor.isMouseDown + }; + }; + + // Actions: + this.position = function(stageX, stageY, ratio) { + if (arguments.length == 0) { + return { + stageX: s.mousecaptor.stageX, + stageY: s.mousecaptor.stageY, + ratio: s.mousecaptor.ratio + }; + }else { + s.mousecaptor.stageX = stageX != undefined ? + stageX : + s.mousecaptor.stageX; + s.mousecaptor.stageY = stageY != undefined ? + stageY : + s.mousecaptor.stageY; + s.mousecaptor.ratio = ratio != undefined ? + ratio : + s.mousecaptor.ratio; + + return self; + } + }; + + this.goTo = function(stageX, stageY, ratio) { + s.mousecaptor.interpolate(stageX, stageY, ratio); + return self; + }; + + this.zoomTo = function(x, y, ratio) { + ratio = Math.min( + Math.max(s.mousecaptor.config('minRatio'), ratio), + s.mousecaptor.config('maxRatio') + ); + if (ratio == s.mousecaptor.ratio) { + s.mousecaptor.interpolate( + x - s.width / 2 + s.mousecaptor.stageX, + y - s.height / 2 + s.mousecaptor.stageY + ); + }else { + s.mousecaptor.interpolate( + (ratio * x - s.mousecaptor.ratio * s.width/2) / + (ratio - s.mousecaptor.ratio), + (ratio * y - s.mousecaptor.ratio * s.height/2) / + (ratio - s.mousecaptor.ratio), + ratio + ); + } + return self; + }; + + this.resize = function(w, h) { + s.resize(w, h); + return self; + }; + + this.draw = function(nodes, edges, labels, safe) { + s.draw(nodes, edges, labels, safe); + return self; + }; + + this.refresh = function() { + s.refresh(); + return self; + }; + + // Tasks methods: + this.addGenerator = function(id, task, condition) { + sigma.chronos.addGenerator(id + '_ext_' + s.id, task, condition); + return self; + }; + + this.removeGenerator = function(id) { + sigma.chronos.removeGenerator(id + '_ext_' + s.id); + return self; + }; + + // Graph methods: + this.addNode = function(id, params) { + s.graph.addNode(id, params); + return self; + }; + + this.addEdge = function(id, source, target, params) { + s.graph.addEdge(id, source, target, params); + return self; + } + + this.dropNode = function(v) { + s.graph.dropNode(v); + return self; + }; + + this.dropEdge = function(v) { + s.graph.dropEdge(v); + return self; + }; + + this.pushGraph = function(object, safe) { + object.nodes && object.nodes.forEach(function(node) { + node['id'] && (!safe || !s.graph.nodesIndex[node['id']]) && + self.addNode(node['id'], node); + }); + + var isEdgeValid; + object.edges && object.edges.forEach(function(edge) { + validID = edge['source'] && edge['target'] && edge['id']; + validID && + (!safe || !s.graph.edgesIndex[edge['id']]) && + self.addNode( + edge['id'], + edge['source'], + edge['target'], + edge + ); + }); + + return self; + }; + + this.emptyGraph = function() { + s.graph.empty(); + return self; + }; + + this.getNodesCount = function() { + return s.graph.nodes.length; + }; + + this.getEdgesCount = function() { + return s.graph.edges.length; + }; + + this.iterNodes = function(fun, ids) { + s.graph.iterNodes(fun, ids); + return self; + }; + + this.iterEdges = function(fun, ids) { + s.graph.iterEdges(fun, ids); + return self; + }; + + this.getNodes = function(ids) { + return s.graph.getNodes(ids); + }; + + this.getEdges = function(ids) { + return s.graph.getEdges(ids); + }; + + // Monitoring + this.activateMonitoring = function() { + return s.monitor.activate(); + }; + + this.desactivateMonitoring = function() { + return s.monitor.desactivate(); + }; + + // Events + s.bind('downnodes upnodes downgraph upgraph', function(e) { + self.dispatch(e.type, e.content); + }); + + s.graph.bind('overnodes outnodes', function(e) { + self.dispatch(e.type, e.content); + }); +} + +/** + * The graph data model used in sigma.js. + * @constructor + * @extends sigma.classes.Cascade + * @extends sigma.classes.EventDispatcher + * @this {Graph} + */ +function Graph() { + sigma.classes.Cascade.call(this); + sigma.classes.EventDispatcher.call(this); + + /** + * Represents "this", without the well-known scope issue. + * @private + * @type {Graph} + */ + var self = this; + + /** + * The different parameters that determine how the nodes and edges should be + * translated and rescaled. + * @type {Object} + */ + this.p = { + minNodeSize: 0, + maxNodeSize: 0, + minEdgeSize: 0, + maxEdgeSize: 0, + // Scaling mode: + // - 'inside' (default) + // - 'outside' + scalingMode: 'inside', + nodesPowRatio: 0.5, + edgesPowRatio: 0 + }; + + /** + * Contains the borders of the graph. These are useful to avoid the user to + * drag the graph out of the canvas. + * @type {Object} + */ + this.borders = {}; + + /** + * Inserts a node in the graph. + * @param {string} id The node's ID. + * @param {object} params An object containing the different parameters + * of the node. + * @return {Graph} Returns itself. + */ + function addNode(id, params) { + if (self.nodesIndex[id]) { + throw new Error('Node "' + id + '" already exists.'); + } + + params = params || {}; + var n = { + // Numbers : + 'x': 0, + 'y': 0, + 'size': 1, + 'degree': 0, + 'inDegree': 0, + 'outDegree': 0, + // Flags : + 'fixed': false, + 'active': false, + 'hidden': false, + 'forceLabel': false, + // Strings : + 'label': id.toString(), + 'id': id.toString(), + // Custom attributes : + 'attr': {} + }; + + for (var k in params) { + switch (k) { + case 'id': + break; + case 'x': + case 'y': + case 'size': + n[k] = +params[k]; + break; + case 'fixed': + case 'active': + case 'hidden': + case 'forceLabel': + n[k] = !!params[k]; + break; + case 'color': + case 'label': + n[k] = params[k]; + break; + default: + n['attr'][k] = params[k]; + } + } + + self.nodes.push(n); + self.nodesIndex[id.toString()] = n; + + return self; + }; + + /** + * Generates the clone of a node, to make it easier to be exported. + * @private + * @param {Object} node The node to clone. + * @return {Object} The clone of the node. + */ + function cloneNode(node) { + return { + 'x': node['x'], + 'y': node['y'], + 'size': node['size'], + 'degree': node['degree'], + 'inDegree': node['inDegree'], + 'outDegree': node['outDegree'], + 'displayX': node['displayX'], + 'displayY': node['displayY'], + 'displaySize': node['displaySize'], + 'label': node['label'], + 'id': node['id'], + 'color': node['color'], + 'fixed': node['fixed'], + 'active': node['active'], + 'hidden': node['hidden'], + 'forceLabel': node['forceLabel'], + 'attr': node['attr'] + }; + }; + + /** + * Checks the clone of a node, and inserts its values when possible. For + * example, it is possible to modify the size or the color of a node, but it + * is not possible to modify its display values or its id. + * @private + * @param {Object} node The original node. + * @param {Object} copy The clone. + * @return {Graph} Returns itself. + */ + function checkNode(node, copy) { + for (var k in copy) { + switch (k) { + case 'id': + case 'attr': + case 'degree': + case 'inDegree': + case 'outDegree': + case 'displayX': + case 'displayY': + case 'displaySize': + break; + case 'x': + case 'y': + case 'size': + node[k] = +copy[k]; + break; + case 'fixed': + case 'active': + case 'hidden': + case 'forceLabel': + node[k] = !!copy[k]; + break; + case 'color': + case 'label': + node[k] = (copy[k] || '').toString(); + break; + default: + node['attr'][k] = copy[k]; + } + } + + return self; + }; + + /** + * Deletes one or several nodes from the graph, and the related edges. + * @param {(string|Array.)} v A string ID, or an Array of several + * IDs. + * @return {Graph} Returns itself. + */ + function dropNode(v) { + var a = (v instanceof Array ? v : [v]) || []; + + a.forEach(function(id) { + if (self.nodesIndex[id]) { + var index = null; + self.nodes.some(function(n, i) { + if (n['id'] == id) { + index = i; + return true; + } + return false; + }); + + index != null && self.nodes.splice(index, 1); + delete self.nodesIndex[id]; + + var edgesToRemove = []; + self.edges = self.edges.filter(function(e) { + if (e['source']['id'] == id) { + delete self.edgesIndex[e['id']]; + e['target']['degree']--; + e['target']['inDegree']--; + return false; + }else if (e['target']['id'] == id) { + delete self.edgesIndex[e['id']]; + e['source']['degree']--; + e['source']['outDegree']--; + return false; + } + return true; + }); + }else { + sigma.log('Node "' + id + '" does not exist.'); + } + }); + + return self; + }; + + /** + * Inserts an edge in the graph. + * @param {string} id The edge ID. + * @param {string} source The ID of the edge source. + * @param {string} target The ID of the edge target. + * @param {object} params An object containing the different parameters + * of the edge. + * @return {Graph} Returns itself. + */ + function addEdge(id, source, target, params) { + if (self.edgesIndex[id]) { + throw new Error('Edge "' + id + '" already exists.'); + } + + if (!self.nodesIndex[source]) { + var s = 'Edge\'s source "' + source + '" does not exist yet.'; + throw new Error(s); + } + + if (!self.nodesIndex[target]) { + var s = 'Edge\'s target "' + target + '" does not exist yet.'; + throw new Error(s); + } + + params = params || {}; + var e = { + 'source': self.nodesIndex[source], + 'target': self.nodesIndex[target], + 'size': 1, + 'weight': 1, + 'displaySize': 0.5, + 'label': id.toString(), + 'id': id.toString(), + 'hidden': false, + 'attr': {} + }; + + e['source']['degree']++; + e['source']['outDegree']++; + e['target']['degree']++; + e['target']['inDegree']++; + + for (var k in params) { + switch (k) { + case 'id': + case 'source': + case 'target': + break; + case 'hidden': + e[k] = !!params[k]; + break; + case 'size': + case 'weight': + e[k] = +params[k]; + break; + case 'color': + e[k] = params[k].toString(); + break; + case 'type': + e[k] = params[k].toString(); + break; + case 'label': + e[k] = params[k]; + break; + default: + e['attr'][k] = params[k]; + } + } + + self.edges.push(e); + self.edgesIndex[id.toString()] = e; + + return self; + }; + + /** + * Generates the clone of a edge, to make it easier to be exported. + * @private + * @param {Object} edge The edge to clone. + * @return {Object} The clone of the edge. + */ + function cloneEdge(edge) { + return { + 'source': edge['source']['id'], + 'target': edge['target']['id'], + 'size': edge['size'], + 'type': edge['type'], + 'weight': edge['weight'], + 'displaySize': edge['displaySize'], + 'label': edge['label'], + 'hidden': edge['hidden'], + 'id': edge['id'], + 'attr': edge['attr'], + 'color': edge['color'] + }; + }; + + /** + * Checks the clone of an edge, and inserts its values when possible. For + * example, it is possible to modify the label or the type of an edge, but it + * is not possible to modify its display values or its id. + * @private + * @param {Object} edge The original edge. + * @param {Object} copy The clone. + * @return {Graph} Returns itself. + */ + function checkEdge(edge, copy) { + for (var k in copy) { + switch (k) { + case 'id': + case 'displaySize': + break; + case 'weight': + case 'size': + edge[k] = +copy[k]; + break; + case 'source': + case 'target': + edge[k] = self.nodesIndex[k] || edge[k]; + break; + case 'hidden': + edge[k] = !!copy[k]; + break; + case 'color': + case 'label': + case 'type': + edge[k] = (copy[k] || '').toString(); + break; + default: + edge['attr'][k] = copy[k]; + } + } + + return self; + }; + + /** + * Deletes one or several edges from the graph. + * @param {(string|Array.)} v A string ID, or an Array of several + * IDs. + * @return {Graph} Returns itself. + */ + function dropEdge(v) { + var a = (v instanceof Array ? v : [v]) || []; + + a.forEach(function(id) { + if (self.edgesIndex[id]) { + self.edgesIndex[id]['source']['degree']--; + self.edgesIndex[id]['source']['outDegree']--; + self.edgesIndex[id]['target']['degree']--; + self.edgesIndex[id]['target']['inDegree']--; + + var index = null; + self.edges.some(function(n, i) { + if (n['id'] == id) { + index = i; + return true; + } + return false; + }); + + index != null && self.edges.splice(index, 1); + delete self.edgesIndex[id]; + }else { + sigma.log('Edge "' + id + '" does not exist.'); + } + }); + + return self; + }; + + /** + * Deletes every nodes and edges from the graph. + * @return {Graph} Returns itself. + */ + function empty() { + self.nodes = []; + self.nodesIndex = {}; + self.edges = []; + self.edgesIndex = {}; + + return self; + }; + + /** + * Computes the display x, y and size of each node, relatively to the + * original values and the borders determined in the parameters, such as + * each node is in the described area. + * @param {number} w The area width (actually the width of the DOM + * root). + * @param {number} h The area height (actually the height of the + * DOM root). + * @param {boolean} parseNodes Indicates if the nodes have to be parsed. + * @param {boolean} parseEdges Indicates if the edges have to be parsed. + * @return {Graph} Returns itself. + */ + function rescale(w, h, parseNodes, parseEdges) { + var weightMax = 0, sizeMax = 0; + + parseNodes && self.nodes.forEach(function(node) { + sizeMax = Math.max(node['size'], sizeMax); + }); + + parseEdges && self.edges.forEach(function(edge) { + weightMax = Math.max(edge['size'], weightMax); + }); + + sizeMax = sizeMax || 1; + weightMax = weightMax || 1; + + // Recenter the nodes: + var xMin, xMax, yMin, yMax; + parseNodes && self.nodes.forEach(function(node) { + xMax = Math.max(node['x'], xMax || node['x']); + xMin = Math.min(node['x'], xMin || node['x']); + yMax = Math.max(node['y'], yMax || node['y']); + yMin = Math.min(node['y'], yMin || node['y']); + }); + + // First, we compute the scaling ratio, without considering the sizes + // of the nodes : Each node will have its center in the canvas, but might + // be partially out of it. + var scale = self.p.scalingMode == 'outside' ? + Math.max(w / Math.max(xMax - xMin, 1), + h / Math.max(yMax - yMin, 1)) : + Math.min(w / Math.max(xMax - xMin, 1), + h / Math.max(yMax - yMin, 1)); + + // Then, we correct that scaling ratio considering a margin, which is + // basically the size of the biggest node. + // This has to be done as a correction since to compare the size of the + // biggest node to the X and Y values, we have to first get an + // approximation of the scaling ratio. + var margin = (self.p.maxNodeSize || sizeMax) / scale; + xMax += margin; + xMin -= margin; + yMax += margin; + yMin -= margin; + + scale = self.p.scalingMode == 'outside' ? + Math.max(w / Math.max(xMax - xMin, 1), + h / Math.max(yMax - yMin, 1)) : + Math.min(w / Math.max(xMax - xMin, 1), + h / Math.max(yMax - yMin, 1)); + + // Size homothetic parameters: + var a, b; + if (!self.p.maxNodeSize && !self.p.minNodeSize) { + a = 1; + b = 0; + }else if (self.p.maxNodeSize == self.p.minNodeSize) { + a = 0; + b = self.p.maxNodeSize; + }else { + a = (self.p.maxNodeSize - self.p.minNodeSize) / sizeMax; + b = self.p.minNodeSize; + } + + var c, d; + if (!self.p.maxEdgeSize && !self.p.minEdgeSize) { + c = 1; + d = 0; + }else if (self.p.maxEdgeSize == self.p.minEdgeSize) { + c = 0; + d = self.p.minEdgeSize; + }else { + c = (self.p.maxEdgeSize - self.p.minEdgeSize) / weightMax; + d = self.p.minEdgeSize; + } + + // Rescale the nodes: + parseNodes && self.nodes.forEach(function(node) { + node['displaySize'] = node['size'] * a + b; + + if (!node['fixed']) { + node['displayX'] = (node['x'] - (xMax + xMin) / 2) * scale + w / 2; + node['displayY'] = (node['y'] - (yMax + yMin) / 2) * scale + h / 2; + } + }); + + parseEdges && self.edges.forEach(function(edge) { + edge['displaySize'] = edge['size'] * c + d; + }); + + return self; + }; + + /** + * Translates the display values of the nodes and edges relatively to the + * scene position and zoom ratio. + * @param {number} sceneX The x position of the scene. + * @param {number} sceneY The y position of the scene. + * @param {number} ratio The zoom ratio of the scene. + * @param {boolean} parseNodes Indicates if the nodes have to be parsed. + * @param {boolean} parseEdges Indicates if the edges have to be parsed. + * @return {Graph} Returns itself. + */ + function translate(sceneX, sceneY, ratio, parseNodes, parseEdges) { + var sizeRatio = Math.pow(ratio, self.p.nodesPowRatio); + parseNodes && self.nodes.forEach(function(node) { + if (!node['fixed']) { + node['displayX'] = node['displayX'] * ratio + sceneX; + node['displayY'] = node['displayY'] * ratio + sceneY; + } + + node['displaySize'] = node['displaySize'] * sizeRatio; + }); + + sizeRatio = Math.pow(ratio, self.p.edgesPowRatio); + parseEdges && self.edges.forEach(function(edge) { + edge['displaySize'] = edge['displaySize'] * sizeRatio; + }); + + return self; + }; + + /** + * Determines the borders of the graph as it will be drawn. It is used to + * avoid the user to drag the graph out of the canvas. + */ + function setBorders() { + self.borders = {}; + + self.nodes.forEach(function(node) { + self.borders.minX = Math.min( + self.borders.minX == undefined ? + node['displayX'] - node['displaySize'] : + self.borders.minX, + node['displayX'] - node['displaySize'] + ); + + self.borders.maxX = Math.max( + self.borders.maxX == undefined ? + node['displayX'] + node['displaySize'] : + self.borders.maxX, + node['displayX'] + node['displaySize'] + ); + + self.borders.minY = Math.min( + self.borders.minY == undefined ? + node['displayY'] - node['displaySize'] : + self.borders.minY, + node['displayY'] - node['displaySize'] + ); + + self.borders.maxY = Math.max( + self.borders.maxY == undefined ? + node['displayY'] - node['displaySize'] : + self.borders.maxY, + node['displayY'] - node['displaySize'] + ); + }); + } + + /** + * Checks which nodes are under the (mX, mY) points, representing the mouse + * position. + * @param {number} mX The mouse X position. + * @param {number} mY The mouse Y position. + * @return {Graph} Returns itself. + */ + function checkHover(mX, mY) { + var dX, dY, s, over = [], out = []; + self.nodes.forEach(function(node) { + if (node['hidden']) { + node['hover'] = false; + return; + } + + dX = Math.abs(node['displayX'] - mX); + dY = Math.abs(node['displayY'] - mY); + s = node['displaySize']; + + var oldH = node['hover']; + var newH = dX < s && dY < s && Math.sqrt(dX * dX + dY * dY) < s; + + if (oldH && !newH) { + node['hover'] = false; + out.push(node.id); + } else if (newH && !oldH) { + node['hover'] = true; + over.push(node.id); + } + }); + + over.length && self.dispatch('overnodes', over); + out.length && self.dispatch('outnodes', out); + + return self; + }; + + /** + * Applies a function to a clone of each node (or indicated nodes), and then + * tries to apply the modifications made on the clones to the original nodes. + * @param {function(Object)} fun The function to execute. + * @param {?Array.} ids An Array of node IDs (optional). + * @return {Graph} Returns itself. + */ + function iterNodes(fun, ids) { + var a = ids ? ids.map(function(id) { + return self.nodesIndex[id]; + }) : self.nodes; + + var aCopies = a.map(cloneNode); + aCopies.forEach(fun); + + a.forEach(function(n, i) { + checkNode(n, aCopies[i]); + }); + + return self; + }; + + /** + * Applies a function to a clone of each edge (or indicated edges), and then + * tries to apply the modifications made on the clones to the original edges. + * @param {function(Object)} fun The function to execute. + * @param {?Array.} ids An Array of edge IDs (optional). + * @return {Graph} Returns itself. + */ + function iterEdges(fun, ids) { + var a = ids ? ids.map(function(id) { + return self.edgesIndex[id]; + }) : self.edges; + + var aCopies = a.map(cloneEdge); + aCopies.forEach(fun); + + a.forEach(function(e, i) { + checkEdge(e, aCopies[i]); + }); + + return self; + }; + + /** + * Returns a specific node clone or an array of specified node clones. + * @param {(string|Array.)} ids The ID or an array of node IDs. + * @return {(Object|Array.)} The clone or the array of clones. + */ + function getNodes(ids) { + var a = ((ids instanceof Array ? ids : [ids]) || []).map(function(id) { + return cloneNode(self.nodesIndex[id]); + }); + + return (ids instanceof Array ? a : a[0]); + }; + + /** + * Returns a specific edge clone or an array of specified edge clones. + * @param {(string|Array.)} ids The ID or an array of edge IDs. + * @return {(Object|Array.)} The clone or the array of clones. + */ + function getEdges(ids) { + var a = ((ids instanceof Array ? ids : [ids]) || []).map(function(id) { + return cloneEdge(self.edgesIndex[id]); + }); + + return (ids instanceof Array ? a : a[0]); + }; + + empty(); + + this.addNode = addNode; + this.addEdge = addEdge; + this.dropNode = dropNode; + this.dropEdge = dropEdge; + + this.iterEdges = iterEdges; + this.iterNodes = iterNodes; + + this.getEdges = getEdges; + this.getNodes = getNodes; + + this.empty = empty; + this.rescale = rescale; + this.translate = translate; + this.setBorders = setBorders; + this.checkHover = checkHover; +} + +sigma.easing = { + linear: {}, + quadratic: {} +}; + +sigma.easing.linear.easenone = function(k) { + return k; +}; + +sigma.easing.quadratic.easein = function(k) { + return k * k; +}; + +sigma.easing.quadratic.easeout = function(k) { + return - k * (k - 2); +}; + +sigma.easing.quadratic.easeinout = function(k) { + if ((k *= 2) < 1) return 0.5 * k * k; + return - 0.5 * (--k * (k - 2) - 1); +}; + +sigma.debugMode = 0; + +sigma.log = function() { + if (sigma.debugMode == 1) { + for (var k in arguments) { + console.log(arguments[k]); + } + }else if (sigma.debugMode > 1) { + for (var k in arguments) { + throw new Error(arguments[k]); + } + } + + return sigma; +}; + +/** + * Add a function to the prototype of SigmaPublic, but with access to the + * Sigma class properties. + * @param {string} pluginName [description]. + * @param {function} caller [description]. + * @param {function(Sigma)} launcher [description]. + */ +sigma.addPlugin = function(pluginName, caller, launcher) { + SigmaPublic.prototype[pluginName] = caller; + local.plugins.push(launcher); +}; +sigma.tools.drawRoundRect = function(ctx, x, y, w, h, ellipse, corners) { + var e = ellipse ? ellipse : 0; + var c = corners ? corners : []; + c = ((typeof c) == 'string') ? c.split(' ') : c; + + var tl = e && (c.indexOf('topleft') >= 0 || + c.indexOf('top') >= 0 || + c.indexOf('left') >= 0); + var tr = e && (c.indexOf('topright') >= 0 || + c.indexOf('top') >= 0 || + c.indexOf('right') >= 0); + var bl = e && (c.indexOf('bottomleft') >= 0 || + c.indexOf('bottom') >= 0 || + c.indexOf('left') >= 0); + var br = e && (c.indexOf('bottomright') >= 0 || + c.indexOf('bottom') >= 0 || + c.indexOf('right') >= 0); + + ctx.moveTo(x, y + e); + + if (tl) { + ctx.arcTo(x, y, x + e, y, e); + }else { + ctx.lineTo(x, y); + } + + if (tr) { + ctx.lineTo(x + w - e, y); + ctx.arcTo(x + w, y, x + w, y + e, e); + }else { + ctx.lineTo(x + w, y); + } + + if (br) { + ctx.lineTo(x + w, y + h - e); + ctx.arcTo(x + w, y + h, x + w - e, y + h, e); + }else { + ctx.lineTo(x + w, y + h); + } + + if (bl) { + ctx.lineTo(x + e, y + h); + ctx.arcTo(x, y + h, x, y + h - e, e); + }else { + ctx.lineTo(x, y + h); + } + + ctx.lineTo(x, y + e); +}; + +sigma.tools.getRGB = function(s, asArray) { + s = s.toString(); + var res = { + 'r': 0, + 'g': 0, + 'b': 0 + }; + + if (s.length >= 3) { + if (s.charAt(0) == '#') { + var l = s.length - 1; + if (l == 6) { + res = { + 'r': parseInt(s.charAt(1) + s.charAt(2), 16), + 'g': parseInt(s.charAt(3) + s.charAt(4), 16), + 'b': parseInt(s.charAt(5) + s.charAt(5), 16) + }; + }else if (l == 3) { + res = { + 'r': parseInt(s.charAt(1) + s.charAt(1), 16), + 'g': parseInt(s.charAt(2) + s.charAt(2), 16), + 'b': parseInt(s.charAt(3) + s.charAt(3), 16) + }; + } + } + } + + if (asArray) { + res = [ + res['r'], + res['g'], + res['b'] + ]; + } + + return res; +}; + +sigma.tools.rgbToHex = function(R, G, B) { + return sigma.tools.toHex(R) + sigma.tools.toHex(G) + sigma.tools.toHex(B); +}; + +sigma.tools.toHex = function(n) { + n = parseInt(n, 10); + + if (isNaN(n)) { + return '00'; + } + n = Math.max(0, Math.min(n, 255)); + return '0123456789ABCDEF'.charAt((n - n % 16) / 16) + + '0123456789ABCDEF'.charAt(n % 16); +}; + +/** + * sigma.chronos manages frames insertion to simulate asynchronous computing. + * It has been designed to make possible to execute heavy computing tasks + * for the browser, without freezing it. + * @constructor + * @extends sigma.classes.Cascade + * @extends sigma.classes.EventDispatcher + * @this {sigma.chronos} + */ +sigma.chronos = new (function() { + sigma.classes.EventDispatcher.call(this); + + /** + * Represents "this", without the well-known scope issue. + * @private + * @type {sigma.chronos} + */ + var self = this; + + /** + * Indicates whether any task is actively running or not. + * @private + * @type {boolean} + */ + var isRunning = false; + + /** + * Indicates the FPS "goal", that will define the theoretical + * frame length. + * @private + * @type {number} + */ + var fpsReq = 80; + + /** + * Stores the last computed FPS value (FPS is computed only when any + * task is running). + * @private + * @type {number} + */ + var lastFPS = 0; + + /** + * The number of frames inserted since the last start. + * @private + * @type {number} + */ + var framesCount = 0; + + /** + * The theoretical frame time. + * @private + * @type {number} + */ + var frameTime = 1000 / fpsReq; + + /** + * The theoretical frame length, minus the last measured delay. + * @private + * @type {number} + */ + var correctedFrameTime = frameTime; + + /** + * The measured length of the last frame. + * @private + * @type {number} + */ + var effectiveTime = 0; + + /** + * The time passed since the last runTasks action. + * @private + * @type {number} + */ + var currentTime = 0; + + /** + * The time when the last frame was inserted. + * @private + * @type {number} + */ + var startTime = 0; + + /** + * The difference between the theoretical frame length and the + * last measured frame length. + * @private + * @type {number} + */ + var delay = 0; + + /** + * The container of all active generators. + * @private + * @type {Object.} + */ + var generators = {}; + + /** + * The array of all the referenced and active tasks. + * @private + * @type {Array.} + */ + var tasks = []; + + /** + * The array of all the referenced and queued tasks. + * @private + * @type {Array.} + */ + var queuedTasks = []; + + /** + * The index of the next task to execute. + * @private + * @type {number} + */ + var taskIndex = 0; + + + /** + * Inserts a frame before executing the callback. + * @param {function()} callback The callback to execute after having + * inserted the frame. + * @return {sigma.chronos} Returns itself. + */ + function insertFrame(callback) { + window.setTimeout(callback, 0); + return self; + } + + /** + * The local method that executes routine, and inserts frames when needed. + * It dispatches a "frameinserted" event after having inserted any frame, + * and an "insertframe" event before. + * @private + */ + function frameInserter() { + self.dispatch('frameinserted'); + while (isRunning && tasks.length && routine()) {} + + if (!isRunning || !tasks.length) { + stopTasks(); + } else { + startTime = (new Date()).getTime(); + framesCount++; + delay = effectiveTime - frameTime; + correctedFrameTime = frameTime - delay; + + self.dispatch('insertframe'); + insertFrame(frameInserter); + } + }; + + /** + * The local method that executes the tasks, and compares the current frame + * length to the ideal frame length. + * @private + * @return {boolean} Returns false if the current frame should be ended, + * and true else. + */ + function routine() { + taskIndex = taskIndex % tasks.length; + + if (!tasks[taskIndex].task()) { + var n = tasks[taskIndex].taskName; + + queuedTasks = queuedTasks.filter(function(e) { + (e.taskParent == n) && tasks.push({ + taskName: e.taskName, + task: e.task + }); + return e.taskParent != n; + }); + + self.dispatch('killed', tasks.splice(taskIndex--, 1)[0]); + } + + taskIndex++; + effectiveTime = (new Date()).getTime() - startTime; + return effectiveTime <= correctedFrameTime; + }; + + /** + * Starts tasks execution. + * @return {sigma.chronos} Returns itself. + */ + function runTasks() { + isRunning = true; + taskIndex = 0; + framesCount = 0; + + startTime = (new Date()).getTime(); + currentTime = startTime; + + self.dispatch('start'); + self.dispatch('insertframe'); + insertFrame(frameInserter); + return self; + }; + + /** + * Stops tasks execution, and dispatch a "stop" event. + * @return {sigma.chronos} Returns itself. + */ + function stopTasks() { + self.dispatch('stop'); + isRunning = false; + return self; + }; + + /** + * A task is a function that will be executed continuously while it returns + * true. As soon as it return false, the task will be removed. + * If several tasks are present, they will be executed in parallele. + * This method will add the task to this execution process. + * @param {function(): boolean} task The task to add. + * @param {string} name The name of the worker, used for + * managing the different tasks. + * @param {boolean} autostart If true, sigma.chronos will start + * automatically if it is not working + * yet. + * @return {sigma.chronos} Returns itself. + */ + function addTask(task, name, autostart) { + if (typeof task != 'function') { + throw new Error('Task "' + name + '" is not a function'); + } + + tasks.push({ + taskName: name, + task: task + }); + + isRunning = !!(isRunning || (autostart && runTasks()) || true); + return self; + }; + + /** + * Will add a task that will be start to be executed as soon as a task + * named as the parent will be removed. + * @param {function(): boolean} task The task to add. + * @param {string} name The name of the worker, used for + * managing the different tasks. + * @param {string} parent The name of the parent task. + * @return {sigma.chronos} Returns itself. + */ + function queueTask(task, name, parent) { + if (typeof task != 'function') { + throw new Error('Task "' + name + '" is not a function'); + } + + if (!tasks.concat(queuedTasks).some(function(e) { + return e.taskName == parent; + })) { + throw new Error( + 'Parent task "' + parent + '" of "' + name + '" is not attached.' + ); + } + + queuedTasks.push({ + taskParent: parent, + taskName: name, + task: task + }); + + return self; + }; + + /** + * Removes a task. + * @param {string} v If v is undefined, then every tasks will + * be removed. If not, each task named v will + * be removed. + * @param {number} queueStatus Determines the queued tasks behaviour. If 0, + * then nothing will happen. If 1, the tasks + * queued to any removed task will be triggered. + * If 2, the tasks queued to any removed task + * will be removed as well. + * @return {sigma.chronos} Returns itself. + */ + function removeTask(v, queueStatus) { + if (v == undefined) { + tasks = []; + if (queueStatus == 1) { + queuedTasks = []; + }else if (queueStatus == 2) { + tasks = queuedTasks; + queuedTasks = []; + } + stopTasks(); + } else { + var n = (typeof v == 'string') ? v : ''; + tasks = tasks.filter(function(e) { + if ((typeof v == 'string') ? e.taskName == v : e.task == v) { + n = e.taskName; + return false; + } + return true; + }); + + if (queueStatus > 0) { + queuedTasks = queuedTasks.filter(function(e) { + if (queueStatus == 1 && e.taskParent == n) { + tasks.push(e); + } + return e.taskParent != n; + }); + } + } + + isRunning = !!(!tasks.length || (stopTasks() && false)); + return self; + }; + + /** + * A generator is a pair task/condition. The task will be executed + * while it returns true. + * When it returns false, the condition will be tested. If + * the condition returns true, the task will be executed + * again at the next process iteration. If not, the generator + * is removed. + * If several generators are present, they will be executed one + * by one: When the first stops, the second will start, etc. When + * they are all ended, then the conditions will be tested to know + * which generators have to be started again. + * @param {string} id The generators ID. + * @param {function(): boolean} task The generator's task. + * @param {function(): boolean} condition The generator's condition. + * @return {sigma.chronos} Returns itself. + */ + function addGenerator(id, task, condition) { + if (generators[id] != undefined) { + return self; + } + + generators[id] = { + task: task, + condition: condition + }; + + getGeneratorsCount(true) == 0 && startGenerators(); + return self; + }; + + /** + * Removes a generator. It means that the task will continue being eecuted + * until it returns false, but then the + * condition will not be tested. + * @param {string} id The generator's ID. + * @return {sigma.chronos} Returns itself. + */ + function removeGenerator(id) { + if (generators[id]) { + generators[id].on = false; + generators[id].del = true; + } + return self; + }; + + /** + * Returns the number of generators. + * @private + * @param {boolean} running If true, returns the number of active + * generators instead. + * @return {sigma.chronos} Returns itself. + */ + function getGeneratorsCount(running) { + return running ? + Object.keys(generators).filter(function(id) { + return !!generators[id].on; + }).length : + Object.keys(generators).length; + }; + + /** + * Returns the array of the generators IDs. + * @return {array.} The array of IDs. + */ + function getGeneratorsIDs() { + return Object.keys(generators); + } + + /** + * startGenerators is the method that manages which generator + * is the next to start when another one stops. It will dispatch + * a "stopgenerators" event if there is no more generator to start, + * and a "startgenerators" event else. + * @return {sigma.chronos} Returns itself. + */ + function startGenerators() { + if (!Object.keys(generators).length) { + self.dispatch('stopgenerators'); + }else { + self.dispatch('startgenerators'); + + self.unbind('killed', onTaskEnded); + insertFrame(function() { + for (var k in generators) { + generators[k].on = true; + addTask( + generators[k].task, + k, + false + ); + } + }); + + self.bind('killed', onTaskEnded).runTasks(); + } + + return self; + }; + + /** + * A callback triggered everytime the task of a generator stops, that will + * test the related generator's condition, and see if there is still any + * generator to start. + * @private + * @param {Object} e The sigma.chronos "killed" event. + */ + function onTaskEnded(e) { + if (generators[e['content'].taskName] != undefined) { + if (generators[e['content'].taskName].del || + !generators[e['content'].taskName].condition()) { + delete generators[e['content'].taskName]; + }else { + generators[e['content'].taskName].on = false; + } + + if (getGeneratorsCount(true) == 0) { + startGenerators(); + } + } + }; + + /** + * Either set or returns the fpsReq property. This property determines + * the number of frames that should be inserted per second. + * @param {?number} v The frequency asked. + * @return {(Chronos|number)} Returns the frequency if v is undefined, and + * itself else. + */ + function frequency(v) { + if (v != undefined) { + fpsReq = Math.abs(1 * v); + frameTime = 1000 / fpsReq; + framesCount = 0; + return self; + } else { + return fpsReq; + } + }; + + /** + * Returns the actual average number of frames that are inserted per + * second. + * @return {number} The actual average FPS. + */ + function getFPS() { + if (isRunning) { + lastFPS = + Math.round( + framesCount / + ((new Date()).getTime() - currentTime) * + 10000 + ) / 10; + } + + return lastFPS; + }; + + /** + * Returns the number of tasks. + * @return {number} The number of tasks. + */ + function getTasksCount() { + return tasks.length; + } + + /** + * Returns the number of queued tasks. + * @return {number} The number of queued tasks. + */ + function getQueuedTasksCount() { + return queuedTasks.length; + } + + /** + * Returns how long sigma.chronos has active tasks running + * without interuption for, in ms. + * @return {number} The time chronos is running without interuption for. + */ + function getExecutionTime() { + return startTime - currentTime; + } + + this.frequency = frequency; + + this.runTasks = runTasks; + this.stopTasks = stopTasks; + this.insertFrame = insertFrame; + + this.addTask = addTask; + this.queueTask = queueTask; + this.removeTask = removeTask; + + this.addGenerator = addGenerator; + this.removeGenerator = removeGenerator; + this.startGenerators = startGenerators; + this.getGeneratorsIDs = getGeneratorsIDs; + + this.getFPS = getFPS; + this.getTasksCount = getTasksCount; + this.getQueuedTasksCount = getQueuedTasksCount; + this.getExecutionTime = getExecutionTime; + + return this; +})(); + +sigma.publicPrototype = SigmaPublic.prototype; +})(); + + --- /dev/null +++ b/licensing.php @@ -1,1 +1,54 @@ + + namelicencing terms"; +$agenciesdb = $server->get_db('disclosr-agencies'); +try { + $rows = $agenciesdb->get_view("app", "all", null, true)->rows; + + + if ($rows) { + + foreach ($rows as $row) { + $rowArray = object_to_array($row->value); + if (isset($rowArray['name'])&& isset($rowArray['website']) && !isset($rowArray['status'])) { + echo "". $rowArray['name'] . ""; + + + + $licences = Array( + "hasCrownCopyright"=>"Crown Copyright", + "hasCCBY"=>"Creative Commons Attribution", + "hasCCBYND" =>"Creative Commons No Derivatives", +"hasCCBYNCND" =>"Creative Commons No Derivatives Non-Commercial", + "hasRestrictiveLicense" => "ERRRRRRRRRRRRRRRRRRR", +"hasRestrictiveLicence" => "Bespoke restrictive (permission for reuse) licences", +"hasRestricitiveLicence"=>"ERRRRRRRRRRRR"); + $websiteLicences = Array(); + foreach ($rowArray as $fieldName => $rowField) { + foreach($licences as $licenceID => $licenceName) { + if (strstr($fieldName,$licenceID)) { + $websiteLicences[$licenceName] = $rowField[0]; + } + } + } + echo ""; + foreach ($websiteLicences as $name => $url) { + echo ''.$name.'
      '; + } + + echo ""; + } + } + } + +} catch (SetteeRestClientException $e) { + setteErrorHandler($e); +} +include_footer(); +?> + + --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -1,5 +1,5 @@ include.path=${php.global.include.path} -php.version=PHP_5 +php.version=PHP_53 source.encoding=UTF-8 src.dir=. tags.asp=false --- a/schemas/agency.json.php +++ b/schemas/agency.json.php @@ -4,9 +4,9 @@ "description" => "Representation of government agency and online transparency measures", "type" => "object", "properties" => Array( - "name" => Array("type" => "string", "required" => true, "x-property" => "schema:name foaf:name", "x-title" => "Name", "description" => "Name, most recent and broadest"), + "name" => Array("type" => "string", "required" => true, "x-itemprop" => "name", "x-property" => "schema:name foaf:name", "x-title" => "Name", "description" => "Name, most recent and broadest"), "shortName" => Array("type" => "string", "required" => false, "x-title" => "Short Name", "description" => "Name shortened, usually to an acronym"), - "foiEmail" => Array("type" => "string", "required" => false, "x-title" => "FOI Contact Email", "description" => "FOI contact email if not foi@"), + "foiEmail" => Array("type" => "string", "required" => false, "x-title" => "FOI Contact Email", "x-itemprop" => "email", "description" => "FOI contact email if not foi@"), "sameAs" => Array("type" => "array", "required" => false, "x-property"=>"owl:sameAs","x-title" => "Same As", "description" => "Same as other URLs/URIs for this entity", "items" => Array("type" => "string")), "otherNames" => Array("type" => "array", "required" => true, "x-title" => "Past/Other Names", "description" => "Other names for organisation", @@ -15,7 +15,7 @@ "items" => Array("type" => "string")), "orgType" => Array("type" => "string", "required" => true, "x-title" => "Organisation Type", "description" => "Org type based on legal formation via FMA/CAC legislation etc."), "parentOrg" => Array("type" => "string", "required" => true, "x-title" => "Parent Organisation", "description" => "Parent organisation, usually a department of state"), - "website" => Array("type" => "string", "required" => true, "x-title" => "Website", "x-property" => "schema:url foaf:homepage", "description" => "Website URL"), + "website" => Array("type" => "string", "required" => true, "x-title" => "Website", "x-itemprop" => "url", "x-property" => "schema:url foaf:homepage", "description" => "Website URL"), "abn" => Array("type" => "string", "required" => true, "x-title" => "Australian Business Number", "description" => "ABN from business register"), "employees" => Array("type" => "string", "required" => true, "x-title" => "2010-2011 employees", "description" => "2010-2011 employees"), "contractListURL" => Array("type" => "string", "required" => true, "x-title" => "Contract Listing", "description" => "Departmental and agency contracts, mandated by the Senate" ), --- a/score.php +++ b/score.php @@ -1,7 +1,7 @@ get_db('disclosr-agencies'); --- a/search.php +++ b/search.php @@ -1,6 +1,6 @@

      Search

      --- a/webserver.php +++ b/webserver.php @@ -1,7 +1,7 @@ namewebserveraccessiblity errors";